【发布时间】:2021-10-16 18:39:24
【问题描述】:
我打算编写一个 C++ 程序,它读取文本文件的每一行,并检查每行写入的数据是否代表有效数据。只有介于 0 和 15 之间的整数被视为有效数据。文本文件名作为命令行参数 (argv[1]) 写入程序中。
文本文件的内容是:
1 2
-3
5
0
d
15
16
3.1
v7
4
8y
2
7
我编写了以下代码,其中while (f.getline(buf, 10)) 用作while 循环条件,因为while(f >> buf) 在遇到空格时停止读取一行。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
/* A function that checks whether a line of data is valid.
The function returns 1 if a line of data is valid, and 0 if it is invalid. */
int ValidityCheck(char* str)
{
int i = 0;
for (i = 0; str[i]; i++)
{
if ((str[i] < '0') || (str[i] > '9')) break;
}
if (str[i])
{
cout << "Invalid data" << endl;
return 0;
}
else if (atoi(str) > 15)
{
cout << "Invalid data" << endl;
return 0;
}
else return 1;
}
int main(int argc, char* argv[])
{
char buf[10];
if (argc == 2)
{
ifstream f(argv[1], ios::in | ios::binary);
if (!f)
{
cout << "Error: cannot open file." << endl;
return 0;
}
while (f.getline(buf, 10))
{
if (ValidityCheck(buf) == 1)
{
cout << buf << endl;
}
}
f.close();
}
return 0;
}
但是,当我运行这段代码时,程序只正确打印出最后一行为 7,并在所有其他行上打印出错误消息,如下所示:
Invalid data
Invalid data
Invalid data
Invalid data
Invalid data
Invalid data
Invalid data
Invalid data
Invalid data
Invalid data
Invalid data
Invalid data
7
如何解决此问题并让程序按预期工作?
【问题讨论】:
-
示例输入文件的最后一行是
8 9。我认为 应该 打印Invalid data并且不明白打印7怎么可能是正确的。另外你为什么要以二进制模式打开文件? -
@NathanPierson 我复制了错误的文件。应该是7。错误已更正。
标签: c++ file-io fstream ifstream