无法读取输入文件ifstream

时间:2011-07-22 13:38:30

标签: c++ ifstream

我正在尝试读取一行中带有两个数字格式的输入文件,并将第一个数字存储在一行中的行中,将第二个数字存储在另一个矢量中。

除了实际读取文件之外,我的代码的每个部分都能正常工作。

我已将couts放在所有地方,看起来当我的文件被打开时,它没有被读取,所以我的向量一直被填满,直到我的内存耗尽。

以下是我的代码中读取文件的部分:

cout << "Input Filename: ";
cin >> input;
//open input file
inputdata.open(input.c_str());
if(!inputdata){
cerr << "Error: Unable to open file!" << endl;
}

while(!inputdata.eof()){
    counter++;
    hold = 0;
    if(counter > 0){
        inputdata >> hold;
        //cout << hold << endl;
        if(counter%2 != 0)
            data.push_back(hold);
        else
            weight.push_back(hold);
    }
}

(其中counter是一个初始化为-1的整数,因为在输入文件的开头有一个单词标题我需要忽略)。

我知道使用.eof()是不赞成的,但实际上并不会影响我正在做的事情。

有没有人在我的代码中看到问题或为什么它不会读取文件?

3 个答案:

答案 0 :(得分:1)

为什么不使用:

std::string firstword;
inputdata >> firstword; // or std::getline(inputdate, firstword);

while (inputdata >> w >> d)
{
  weight.push_back(w);
  data.push_back(d);
}

由于数据和重量是成对的(可能我改变了w和d),因此它更清晰。

答案 1 :(得分:1)

在while循环中使用.eof()是错误的。例如,

while(!inputdata.eof()){
   ... 
}

错误

这是correct use

if (!(cin >> foo)) {
  if (cin.eof()) {
    cout << "read failed due to EOF\n";
  } else {
    cout << "read failed due to something other than EOF\n";
  }
}

此外,在C++ FAQ, in Section 15.5它说“为什么我的输入似乎处理超过文件的末尾?”

  

因为在尝试读取之前,eof状态可能不会被设置   过了文件的结尾。也就是说,从文件中读取最后一个字节可能   没有设置eof状态。例如,假设输入流被映射到a   键盘 - 在这种情况下,理论上甚至不可能   C ++库预测用户是否只是该字符   键入将是最后一个字符。

您还需要检查fstream是否已正确打开,

if (inputdata.is_open()) { /* ok, proceed with output */ }

执行if(!inputdata)不是正确的检查。

答案 2 :(得分:0)

“因为我需要忽略输入文件开头的单字标题” 这可能有问题。尝试使用整数或浮点数来阅读文本时会遇到麻烦。

如果此单词位于单独的行中,请尝试以下操作: http://www.cplusplus.com/reference/iostream/istream/getline/

否则,尝试用临时字符串读取第一个单词。\