c++ - 读取可能不完整的文件 C++

标签 c++ file visual-c++

我正在编写一个程序来重新格式化 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/

相关文章:

c++ - 将非 char* 参数传递给 execvp

c++ - 在 C++ 中打印阿拉伯字符串

java - 读取带有可能由空格分隔的整数的文件

c++ - VS2015中的wpath在哪里

c++ - 按钮键盘焦点问题

c++ - 如何从套接字创建 'ostream'?

C++ operator= 在类成员中带有互斥量

Swift 将 base64 字符串(即 docx 文件)转换为 (nsdata)

file - VBscript WMI 不定位文件,FSO 做

c++ - 为什么 Visual C++ 会在 delete[] 上覆盖这么多额外的内存?