如何在从文件中读取整数时使用 file.eof()?

How to use file.eof() while reading in integers from a file?

本文关键字:file eof 整数 文件 读取      更新时间:2023-10-16

我正在编写一个从文件中读取数据的程序。该文件包含整数行,例如

5 6 2 8 6 7

2 5 3

4 0 9 1 3

每行的第一个整数对应于该行中的数字数。我的目标是读取每一行,将数字存储在向量中,并对它们进行一些操作。这是我所做的:

int main(){
vector<int> vec;
int amount;
int nums;
ifstream file ("file.txt");

while(!(file.eof())){
file >> amount;
cout << amount << endl;
for (int i = 0; i < amount; i++){
file >> nums;
vec.push_back(nums);
}
printArray(vec);
bubbleSort(vec);
vec.clear();
}
return 0;
}

不幸的是,最后一行总是被读两次。我在网上查看并看到 eof(( 函数不应该用于维护循环。在这种情况下,我还可以使用什么?

谢谢。

operator>>

设置流的eofbit标志,如果它尝试读取过去的EOF。 您可以使用该条件来中断循环。 但是,在评估eof()之前,您必须实际执行读取操作。 请参阅为什么循环条件中的iostream::eof(即'while (!stream.eof((((被认为是错误的?了解更多详情。

由于您正在处理基于行的文本,因此可以使用std::getline()先读取每一行,然后可以使用std::istringstream来解析每一行,例如:

int main()
{
vector<int> vec;
ifstream file ("file.txt");
string line;
while (getline(file, line)) {
istringstream iss(line);
int amount, nums;
iss >> amount;
cout << amount << endl;
for (int i = 0; (i < amount) && (iss >> nums); ++i){
vec.push_back(nums);
}
printArray(vec);
bubbleSort(vec);
vec.clear();
}
return 0;
}

或者,您可以简单地利用operator>>跳过空格的事实,包括换行符,例如:

int main()
{
vector<int> vec;
int amount, nums;
ifstream file ("file.txt");
while (file >> amount) {
cout << amount << endl;
for (int i = 0; (i < amount) && (file >> nums); ++i){
vec.push_back(nums);
}
printArray(vec);
bubbleSort(vec);
vec.clear();
}
return 0;
}

但是,与std:getline()方法相比,此方法对输入数据中的错误的弹性会稍差一些。 如果给定行中的实际数字量与行首的指定数量不匹配,则此方法将使文件读取不同步。 更糟糕的是,如果给定的行包含任何非整数值,则此方法根本无法读取任何后续数据。

std:getline()方法中,如果给定的行格式不正确,代码将简单地移动到下一行并继续前进,就像没有发生任何不好的事情一样。