输入文件读取错误值和eof控制循环不会结束

时间:2018-01-19 23:16:44

标签: c++ file-io ifstream eof

我试图使用一个循环来读取输入文件中的数据,该循环应该在函数内的文件末尾停止。文件中的数据按如下行排列:

 Zip Drive
 89
 Warehouse C
 75.89
 Keyboard
 133
 Warehouse C
 25.95

在第四行,变量填充了一些垃圾输入,之后读取的所有内容都是空白。循环也不会结束。

int ReadData(string productName[], string productLocation[], int productQty[], double productPrice[])
{
    ifstream infile;
    int i = 0;
    infile.open("prog1.txt");

    do {
        getline(infile, productName[i]);
        infile >> productQty[i];
        getline(infile, productLocation[i]);
        infile >> productPrice[i];
        i++;
    } while (!infile.eof());

    infile.close();
    return i;
} 

1 个答案:

答案 0 :(得分:1)

infile >> productQty[i]infile >> productPrice[i]语句正在读取int / double个值,并在流中留下换行符,以供下一个{{1调用,这不是你想要发生的事情。

您需要:

  1. 使用std::getline()读取每一行,然后使用std::getline()来解析各自行中的std::istringstream / int值:

    double
  2. 在阅读int ReadData(string productName[], string productLocation[], int productQty[], double productPrice[]) { ifstream infile("prog1.txt"); int i = 0; while (getline(infile, productName[i])) { getline(infile, line); istringstream(line) >> productQty[i]; getline(infile, productLocation[i]); getline(infile, line); istringstream(line) >> productPrice[i]; ++i; } infile.close(); return i; } / infile.ignore()值后致电int,以阅读和解除换行符:

    double
  3. 在任何一种情况下,都必须为数组预先分配足够的元素,以容纳与文件中一样多的产品。由于代码无法实际验证该计数,我建议采用另一种更安全的方法:

    int ReadData(string productName[], string productLocation[], int productQty[], double productPrice[])
    {
        ifstream infile("prog1.txt");
        int i = 0;
    
        while (getline(infile, productName[i]))
        {
            infile >> productQty[i];
            infile.ignore(numeric_limits<streamsize>::max(), '\n');
            getline(infile, productLocation[i]);
            infile >> productPrice[i];
            infile.ignore(numeric_limits<streamsize>::max(), '\n');
            ++i;
        }
    
        infile.close();
        return i;
    }