我正在尝试读取一行中带有两个数字格式的输入文件,并将第一个数字存储在一行中的行中,将第二个数字存储在另一个矢量中。
除了实际读取文件之外,我的代码的每个部分都能正常工作。
我已将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()
是不赞成的,但实际上并不会影响我正在做的事情。
有没有人在我的代码中看到问题或为什么它不会读取文件?
答案 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/
否则,尝试用临时字符串读取第一个单词。\