我有一个程序从文本文件中读取整数并跳过非整数和奇怪的符号。然后文本文件如下:
# Matrix A // this line should be skipped because it contains # symbol
1 1 2
1 1$ 2.1 // this line should be skipped because it contains 2.1 and $
3 4 5
我必须打印出没有奇怪符号和非整数行的矩阵。那就是输出应该是:
1 1 2
3 4 5
我的代码
ifstream matrixAFile("a.txt", ios::in); // open file a.txt
if (!matrixAFile)
{
cerr << "Error: File could not be opened !!!" << endl;
exit(1);
}
int i, j, k;
while (matrixAFile >> i >> j >> k)
{
cout << i << ' ' << j << ' ' << k;
cout << endl;
}
但是当它获得第一个#符号时失败了。有人帮忙吗?
答案 0 :(得分:1)
您的问题在于此代码。
int i, j, k;
while (matrixAFile >> i >> j >> k)
分配是&#34;查明该行是否包含整数&#34;
但您的代码正在说&#34;我已经知道该行包含整数&#34;
答案 1 :(得分:1)
如果每行设置为三个整数,我建议使用这种模式:
#include <fstream>
#include <sstream>
#include <string>
std::ifstream infile("matrix.txt");
for (std::string line; std::getline(infile, line); )
{
int a, b, c;
if (!(std::istringstream(line) >> a >> b >> c))
{
std::cerr << "Skipping unparsable line '" << line << "'\n";
continue;
}
std::cout << a << ' ' << b << ' ' << c << std::endl;
}
如果每行的数字数是可变的,您可以使用这样的跳过条件:
line.find_first_not_of(" 0123456789") != std::string::npos
答案 2 :(得分:0)
由于这是一项任务,我不会给出完整的答案。
Read the data line by line to a string(call it str),
Split str into substrings,
In each substring, check if it's convertible to integer value.
另一个技巧是读取一行,然后检查每个字符是否在0-9之间。如果您不需要考虑负数,它就可以工作。
答案 3 :(得分:0)
当然,这在#
字符处失败:#
不是整数,因此,将其作为整数读取失败。你能做的是尝试读取三个整数。如果此操作失败并且您尚未达到EOF(即matrixAFile.eof()
收益false
,则可以clear()
错误标记,ignore()
一切都可以换行。错误恢复将看起来像这样:
matrixAFile.clear();
matrixAFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
请注意,如果您失败,则需要纾困,因为eof()
是true
。
答案 4 :(得分:0)
我想我一次只能读一行字符串。我将字符串复制到输出中,只要它只包含数字,空格和(可能)-
。