2010-10-07 59 views
0

有人可以幫我弄清楚這個C++代碼是幹什麼的,但我想知道它在什麼地方。我已經想出了一些,但有些東西我無法得到我的頭。那就是:在C++中讀取的文件

vector<double> prices;   // vector of option prices 
vector<int> strikes;    // vector of strikes 
char buffer[100];     // buffer for line read 
char dataBuffer[100];   // stores current data string read 
char *str = NULL;     // pointer to data string 
const char *file = "optionData.txt"; // file with option chain info 
ifstream fin;      // input file stream 

fin.clear(); 
fin.open(file); 
if (fin.good()) 
{ 
    while (!fin.eof()){ 
     // read in one line at a time 
     fin.getline(buffer,sizeof(buffer)/sizeof(buffer[0])); 
     ifstream str1(buffer); 

     // Get data 
     str1 >> dataBuffer; // read data from file 
     while (!str1.eof()){ 
      // read in contract maturity, strike, and price 
      str1 >> dataBuffer;  // read option maturity month 
      str1 >> dataBuffer;  // read option maturity year 

      str1 >> dataBuffer;  /read option maturity strike 
      // convert strike char* data to integers 
      // and add to strike vector 
      strikes.push_back(atoi(dataBuffer)); 

      str1 >> dataBuffer;  // read option market price 
      // convert option price char* data to floats 
      // and add to strike vector 
      prices.push_back(atof(dataBuffer)); 
     } 

     buffer[strlen(buffer) + 1] = '\0'; 
    } 
} 
else 
{ 
    cout << "File not good!" << "\n"; 
} 
// close file 
fin.close(); 

什麼,我不明白是以下

  1. ifstream str1(buffer);
  2. fin.getline(buffer,sizeof(buffer)/sizeof(buffer[0]));
    特別sizeof(buffer)/sizeof(buffer[0])
  3. buffer[strlen(buffer) + 1] = '\0';
  4. str1 >> dataBuffer;

的文件中讀取是「optionData.txt」和它的一個樣本:

Jan 03 35.00 40.50 Jan 03 95.00 0.30 
Jan 03 40.00 25.30 Jan 03 100.00 0.20 
Jan 03 45.00 29.50 Jan 03 105.00 0.05 
Jan 03 50.00 16.80 Jan 03 110.00 0.10 
Jan 03 55.00 12.60 Jan 03 115.00 0.15 
Jan 03 60.00 9.30 Jan 03 120.00 0.15 
Jan 03 65.00 6.40 Jan 03 125.00 0.10 
Jan 03 70.00 4.10 Jan 03 130.00 0.10 
Jan 03 75.00 2.60 Jan 03 140.00 0.10 
Jan 03 80.00 1.50 Jan 03 150.00 0.05 
Jan 03 85.00 0.90 Jan 03 155.00 0.00 
Jan 03 90.00 0.50 Jan 03 160.00 0.05 

請耐心等待我,我自學C++。我跑了它,但它凍結了我的機器。

+2

如果您要教導自己的C++,一定要得到自己[一個很好的初學者的C++的書(http://stackoverflow.com/questions/ 388242 /對,最終-C-書指南和列表)。你沒有得到的C++代碼行很基礎。 – 2010-10-07 22:29:37

+0

也許我應該改說,並說我沒有看到需要,我已經看到了比這更簡單的例子在書 – Vaolter 2010-10-07 22:34:45

+1

作爲簡單的例子做,並停止調用eof()所有的時間。 ;-)而是檢查流轉換運算符的布爾值。例如。 'if(str1 >> dataBuffer)'... – 2010-10-07 22:41:29

回答

1

難怪你的機器被凍結了,內部的懸垂不會停止。

無論如何,我做了一些修改,我不想改變整個代碼,以便於您理解。

vector<double> prices;   // vector of option prices 
vector<int> strikes;    // vector of strikes 
string buffer;     // buffer for line read 
string dataBuffer;   // stores current data string read 
char *str = NULL;     // pointer to data string 
const char *file = "./optionData.txt"; // file with option chain info 
ifstream fin;      // input file stream 

fin.clear(); 
fin.open(file); 
if (fin.good()) 
{ 
    while (!fin.eof()){ 
     // read in one line at a time 
    getline(fin,buffer); 
     stringstream str1(buffer); 
     // Get data 
     //str1 >> dataBuffer; // read data from file 
     while (str1 >> dataBuffer){ 
      // read in contract maturity, strike, and price 
      // read option maturity month 
      str1 >> dataBuffer;  // read option maturity year 
      str1 >> dataBuffer;  // read option maturity strike 
      // convert strike char* data to integers 
      // and add to strike vector 
    strikes.push_back(atoi(dataBuffer.c_str())); 
      str1 >> dataBuffer;  // read option market price 
      // convert option price char* data to floats 
      // and add to strike vector 
    prices.push_back(atof(dataBuffer.c_str())); 
     } 
     // buffer[strlen(buffer) + 1] = '\0'; 
    } 
} 
else 
{ 
    cout << "File not good!" << "\n"; 
} 
// close file 
fin.close(); 

我將dataBuffer和buffer更改爲string而不是char []。這很容易管理。

主要變化是str1。我把它從ifstream改成了stringstream,因爲你已經擁有了內存中的數據。關於這些問題

,我覺得人回答了你很好

+0

應該!str1.eof()不檢查行尾而不是文件結尾? – Vaolter 2010-10-10 18:15:47

+0

我已經嘗試過您發佈的文件上的解決方案,但最後的值不在數據文件中。 – Vaolter 2010-10-10 23:51:11

+0

我的不好,我現在更新了代碼...試試吧...謝謝你告訴我.. – Bander 2010-10-11 16:59:15

1

它一直以來我做C++很長一段時間,但這裏有雲:

  1. 聲明與分配的緩衝區的I/O流。
  2. 除法取整數組的大小(以字節爲單位),並將其除以元素的大小 - 給出元素的數量。
  3. Null在緩衝區[]中終止字符串。在字符串的末尾添加一個0字節。這是C標準的字符串符號。但是,strlen()預計已經在緩衝區中有一個以空字符結尾的字符串,所以我不太明白這行代碼的作用。
  4. 從I/O流中讀取數據並將輸入指向分配的緩衝區。 >>操作符已經爲ifstream類重載。
+0

它爲什麼凍結我的機器? – Vaolter 2010-10-07 22:36:36

+0

@Vaolter:嘗試用調試器逐步完成,看看究竟在哪裏失敗。 – ysap 2010-10-07 22:39:06

+0

這個1要麼是錯誤的,要麼是至少不清楚的; 'buffer'包含要打開的文件的名稱。 – 2010-10-07 22:54:34

2
  1. 聲明輸入流,打開在buffer中指定的文件。
  2. 這是一種標準方法來獲取在棧上聲明的數組元素的數量;它需要整個數組的大小(在char s中)並將其除以每個元素的大小;在這種特殊情況下,它始終是無用的,因爲它始終是sizeof(char)==1,但在將來該項目轉向wchar_t s可能會有用。
  3. 我不清楚。看來作者想要NUL - 終止字符串,但strlen需要一個已經終止的字符串才能工作,所以這件事似乎毫無意義。
  4. 使用正確的超載operator>>讀取指定變量中的下一個字段。

由於您提出的問題非常基本,我建議您抓住一本基本的C++書籍並閱讀它;在C++中習慣性地使用習慣很容易,特別是如果你學會了「糟糕」並且沒有經常理解正在發生的事情。

順便說一句,在這條線:

  str1 >> dataBuffer;  /read option maturity strike 

有缺少一個斜槓,編譯器會抱怨。此外,迭代檢查EOF並不是一件好事,您還應該檢查其他流錯誤,否則可能會陷入無限循環(我認爲這是發生的事情)。


編輯:恩,現在我明白髮生了什麼;代碼的作者想使用 stringstream,但是使用了 ifstream,這對他所要做的並不是很好(特別是因爲他試圖打開一個名爲整個行的文件,只是從文件中讀取)。順便說一句,我不認爲在這裏使用 stringstream是有用的,爲什麼不從原始文件中讀取?

+1

而不是'while(!fin.eof())',嘗試'while(fin.good())'。 – bta 2010-10-07 23:03:01

+0

...並在外面檢查設置了哪些錯誤標誌:如果'eof'開啓,則罰款,如果開啓了「壞」或「失敗」(沒有eof),則必須報告錯誤。 – 2010-10-07 23:05:27