C++ 无限循环读取文件创建重定向命令输出

c++ endless loop reading file created redirecting command output

本文关键字:命令 输出 重定向 文件创建 无限循环 读取 C++      更新时间:2023-10-16

我正在编写一段代码,在其中检查给定目录中是否有新文件或目录。在我的情况下,上次在该目录中运行代码时被视为新情况。因此,我创建了一个日志文件,然后在字符串向量中获取日志。代码如下:

ifstream Finp;
string directory;
vector <string> newfilelist;
system( ("ls -B "+directory+" > "+directory+"filelist.log").c_str() );
Finp.open( (directory+"filelist.log").c_str() );
while ( true ) {
  string stmp;
  Finp >> stmp;
  if( Finp.eof() ) break;
  newfilelist.push_back( stmp );
}

现在发生的事情如下:

1)如果日志"filelist.log"已经存在,则一切运行顺利

2)如果日志"filelist.log"不存在,则正确创建它,但是当代码打开文件并开始获取它时,它会卡在循环中,并且stmp字符串无限地为空(好像文件没有eof()但为空!有趣的是,如果我在打开日志之前放置一个随机的系统命令,一切都会顺利进行!

我错过了什么?

我认为

,您唯一需要更改的是令人讨厌的while(true)循环while(file<< to_variable)。这只会在有一些数据时读取数据。

eof()实际上很有欺骗性。您会猜测它是在文件末尾调用的。虽然为 true,但当您尝试在 >> 操作中读取文件时,流中的指针将在EOF之前跳回并尝试读取其中的内容。

这里很少有

线程只讨论EOF并将其用作循环的条件。

如果文件不存在,Finp.open()基本上会失败,检查Finp.eof()是没有意义的。在尝试进入循环读取或检查 eof 之前,您需要使用 Finp.good() 检查Finp状态,然后仅在此方法返回 true 时才继续读取。