我正在编写一个程序来重新格式化 DNS 日志文件以插入到数据库中。日志文件中当前写入的行可能不完整。如果是,我想丢弃它。
我开始相信 eof
函数可能很适合我的应用程序,但是我注意到很多程序员劝阻使用 eof
函数。我还注意到 feof
函数似乎非常相似。
非常感谢你们能提供的关于这些功能的副作用的任何建议/解释,以及对更合适的方法的任何建议!
编辑:我目前正在使用istream::peek
函数来跳过最后一行,无论它是否完整。虽然可以接受,但确定最后一行是否完整的解决方案将是首选。
我使用的具体比较是:logFile.peek() != EOF
最佳答案
我会考虑使用
int fseek ( FILE * stream, long int offset, int origin );
使用SEEK_END
然后
long int ftell ( FILE * stream );
确定文件中的字节数,因此 - 文件结束的位置。我发现这在检测文件结尾(以字节为单位)时更可靠。
您能否在文件的最后两个或三个字节中检测到(记录/行结束)EOR 标记(也许是 CRLF)? (3 个字节可能用于 CRLF^Z...取决于文件类型)。这将验证您是否有完整的最后一行
fseek (stream, -2,SEEK_END);
fread (2 bytes... etc
如果您尝试使用独占锁打开文件,您可以检测到(通过打开失败)该文件正在使用中,并在一秒钟内重试...(或任何时候)
关于c++ - 读取可能不完整的文件 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34662354/