簡體   English   中英

用C ++讀取文件

[英]file reading in 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 ++。 我運行了它,但是它凍結了我的機器。

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

由於您所提出的問題是非常基本的,因此建議您閱讀一本基本的C ++書籍並閱讀; 在C ++中養成不良習慣是很容易的,尤其是如果您“不好”學習了C ++並且又不總是了解發生了什么。

順便說一句,在這一行:

            str1 >> dataBuffer;       / read option maturity strike

缺少斜線,編譯器會抱怨。

此外,僅檢查EOF在流上進行迭代不是一件好事,您還應該檢查其他流錯誤,否則您可能會陷入無限循環(我認為這就是這里發生的事情)。


編輯 :嗯,現在我知道發生了什么事; 該代碼的作者希望使用stringstream ,但是使用了ifstream ,這對於他想做的事情根本沒有好處(特別是因為他試圖打開一個名為從文件中讀取的整行的文件)。 順便說一句,我不認為在這里使用stringstream是有用的,為什么不只是從原始文件中讀取呢?

自從我開始使用C ++已經很長時間了,但是在這里:

  1. 聲明具有分配的緩沖區的I / O流。
  2. 除法將整個數組的大小(以字節為單位)除以一個元素的大小-得出元素的數量。
  3. Null終止buffer []中的字符串。 在字符串的末尾添加一個0字節。 這是C標准字符串表示法。 但是, strlen()期望緩沖區中已經有一個以null結尾的字符串,因此我不太清楚這行的作用。
  4. 從I / O流中讀取並將輸入定向到分配的緩沖區。 對於ifstream類,>>運算符已重載。

難怪您的機器被凍結了,內部活門不會停止。

無論如何,我做了一些更改,但我不想更改整個代碼以使您更容易理解。

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更改為字符串而不是char []。 這很容易管理。

主要變化是str1。 我將它從ifstream更改為stringstream,因為您已經在內存中存儲了數據。

關於這些問題,我認為其他人對你的回答很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM