我正在编写一个代码,在其中检查给定目录中的新文件或目录。在我的情况下新的被认为是上次代码已在该目录中运行。所以我创建了一个日志文件,然后我在字符串向量中获取日志。代码如下:
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字符串无休止地为空(就好像file没有eof()但是空了!)。有趣的是,如果我在打开日志之前放置一个随机系统命令,一切都会顺利进行!
我错过了什么?
答案 0 :(得分:0)
我认为,你唯一需要改变的就是那个令人讨厌的while(true)
循环到while(file<< to_variable)
。如果有一些数据,这只能读取数据。
eof()
实际上是非常具有欺骗性的。您可能会猜到它在文件末尾被调用。虽然如此,当您尝试在>>
操作中读取文件时,流中的指针将在EOF
之前跳回并尝试读取那里的内容。
这里有很多线程只讨论EOF
并将其用作循环的条件。
答案 1 :(得分:0)
如果文件不存在,Finp.open()
基本上会失败,检查Finp.eof()
毫无意义。在尝试进入循环以读取或检查eof之前,您需要使用Finp
检查Finp.good()
状态,然后仅在此方法返回true时继续读取。