gpt4 book ai didi

c++ - 与 fileIO 中的空格混淆

转载 作者:行者123 更新时间:2023-11-28 06:09:39 24 4
gpt4 key购买 nike

我有如下所示的良好输入文件:

734 220 915 927 384 349 79 378 593 46 2 581 500 518 556 771 697
571 891 181 537 455

和看起来像这样的错误输入文件:

819 135 915 927 384 349 79 378 593 46 2 581 500 518 556 771 697
551 425 815 978 626 207 931 ABCDEFG 358 16 875 936 899 885 195 565
571 891 181 537 110

两个文件末尾的最后一个整数后面有一个空格。我正在尝试用 C++ 编写一个脚本,它将读取所有整数,除非有第二个示例中的字符/字符串,在这种情况下它会提醒我这一点。我试着这样写:

int main()
{
int n;
bool badfile = false;
ifstream filein("data.txt");

while (!filein.eof())
{
filein >> n;
if(filein.fail())
{
cout << "Not an integer." << endl;
badfile = true;
break;
}
cout << n << " ";
}

cout << endl << "file check: " << badfile << endl;
}

但是 filein.fail() 是由好文件末尾的空格以及坏文件中的字符/字符串触发的。那么我该如何设置它以使其忽略空格呢?为什么它只有在末尾有空格时才会失败,而不是在所有空格处都失败或完全忽略它们?

最佳答案

主要问题是您如何在流上测试 eof()...它仅在输入尝试尝试读取更多字符时设置文件结尾。首先使用 std::ws 来消耗空格意味着 eof 检测可以是可靠的:如果你不是那么在 eof() 你知道您在一些非空白输入处应该是一个数字 - 如果不是,则您的输入内容有误。

建议代码:

#include <iostream>
#include <fstream>
#include <iomanip>

int main()
{
if (ifstream filein("data.txt"))
{
while (filein >> std::ws && !filein.eof())
{
int n;
if (filein >> n)
cout << n << ' ';
else
{
std::cerr << "error in input\n";
exit(EXIT_FAILURE);
}
}
std::cout << '\n';
}
else
std::cerr << "unable to open data.txt\n";
}

另一种方法出现在下面,它可能更容易理解,但并不完全可靠。问题是,尽管有错误的输入,例如尾随 -+,您仍然可以到达 EOF,因为在尝试读取数字时会消耗它,但不在本身足以构成对数字的成功解析。仅当已知文件有一个 '\n' 终止最后一行时,这才是可靠的:

        int n;
while (filein >> n)
cout << n << " ";
filein.clear(); // remove the error state
if (filein.peek() != istream::traits_type::eof())
{
// while didn't reach EOF; must be parsing error
std::error << "invalid input\n";
exit(EXIT_FAILURE);
}

关于c++ - 与 fileIO 中的空格混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com