用C ++读取文件

时间:2010-10-07 22:24:48

标签: 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;
  5. 正在读取的文件是“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 ++。我跑了但它冻结了我的机器。

3 个答案:

答案 0 :(得分:2)

  1. 声明输入流,打开buffer
  2. 中指定的文件
  3. 这是获取在堆栈上声明的数组元素数量的标准方法;它占用了数组的整个大小(在char s中)并除以每个元素的大小;在这种特殊情况下,它始终是sizeof(char)==1无用的,但在将来项目转向wchar_t时它会很有用。
  4. 我不清楚。似乎作者希望NUL - 终止字符串,但strlen需要一个已经终止的字符串才能工作,所以这似乎毫无意义。
  5. 使用operator>>的正确重载来读取指定var中的下一个字段。
  6. 由于您提出的问题非常基本,我建议您抓一本基本的C ++书籍并阅读它;在C ++中养成坏习惯很容易,特别是如果你“非常”地学习它并且不总是理解正在发生的事情。

    顺便说一下,在这一行:

                str1 >> dataBuffer;       / read option maturity strike
    

    缺少斜线,编译器会抱怨。

    此外,迭代一个流只检查EOF不是一件好事,你还应该检查其他流错误,否则你可能陷入无限循环(我认为这就是这里发生的事情)。

    <小时/> 编辑:呃,现在我明白发生了什么;代码的作者想要使用stringstream,而是使用ifstream,这对他想要做的事情一点也不好(特别是因为他试图打开一个名为整体的文件行只是从文件中读取)。顺便说一句,我不认为使用stringstream在这里有用,为什么不从原始文件中读取?

答案 1 :(得分:1)

自从我做C ++以来已经很长时间了,但在这里:

  1. 使用分配的缓冲区声明I / O流。
  2. 除法取整个数组的大小(以字节为单位),并将其除以元素的大小 - 给出元素的数量。
  3. Null终止buffer []中的字符串。在字符串的末尾添加一个0字节。这是C标准字符串表示法。但是, strlen()期望缓冲区中已经存在一个以空字符结尾的字符串,所以我不太清楚这行有什么贡献。
  4. 从I / O流中读取并将输入定向到分配的缓冲区。 &gt;&gt;运算符为ifstream类重载。

答案 2 :(得分: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更改为字符串而不是char []。这很容易管理。

主要变化是str1。我将它从ifstream改为stringstream,因为你已经拥有了内存中的数据。

关于这些问题,我认为其他人对你的回答非常好