当文件中的行数小于 C++ 中目标中读取的行数时,如何中止?

How to abort when the number of rows in the file is less than the number of rows read in the target in C++?

提问人:Zhao Dazhuang 提问时间:8/3/2022 最后编辑:Zhao Dazhuang 更新时间:8/6/2022 访问量:58

问:

现在我有一个像这样的 txt 文件:

5

1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
5

1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
...

此文件的一个循环是 7 行,7 行中的第二行是空行。我的文件一共有5个循环,但是当我的代码设置为读取10个循环时,代码不会报错,我应该如何修改代码报错在文件末尾,注意我的文本文件出现一个空行。

#include<fstream>
#include<string>
int main()
{

  std::ifstream get_in("tst.txt", std::ios :: in );

  for ( int loop=0;loop<10;loop++ )
  {
    std::string line;

    for ( int i=0;i<7;i++ )
    {
      getline(get_in, line);
    }
  }
return 0;
}

这是我代码的一个简化示例,我希望它在文本不足以满足我想要读取的行数时出错,而不是正常运行。

C++ 字符串 C++11 IO

评论

0赞 Quimby 8/3/2022
我认为您应该添加到第 231 行并完全删除第 67-82 行。如果您遇到任何错误,请发布一个最小的可重现示例break;
0赞 Stack Danny 8/3/2022
您必须为这个问题添加详细信息,发布您正在使用的代码并描述代码失败的地方。
1赞 paddy 8/3/2022
您询问如何修改“代码”,但您没有显示任何代码。据我所知,您的实际格式是“矩阵中的行数”,然后是空行,然后是第一行中给出的行数。因此,如果您读取第一行并且它不包含单个值,或者如果该记录中任何后续行的输入提前终止,则显然是一个错误。
0赞 drescherjm 8/3/2022
也许像这个示例代码一样构建你的文件读取代码:https://stackoverflow.com/questions/55977686/how-to-read-text-file-lines-into-vectors

答:

0赞 Scott 8/6/2022 #1

检查输入流的 eof 位,这可以通过直接访问它 get_in.eofbit 或使用 eof() 函数 get_in.eof () 来完成。

我建议使用 eof() 函数。

我不确定你对你的代码做了什么,但这里有一个简单易懂的代码修改作为演示:

#include <fstream>
#include <string>
#include <iostream>

int main()
{

  std::ifstream get_in("tst.txt", std::ios :: in );
  std::string line;
  for ( int loop=0;loop<10;loop++ )
  {
    if(get_in.eof()) { std::cout << "EOF"; break; }
    for ( int i=0;i<7;i++ )
    {
      std::getline(get_in, line);
      if(get_in.eof()) break;
      std::cout << line << std::endl;
    }
  }
return 0;
}