【问题标题】:How to avoid reading mistaken '\n' from file?如何避免从文件中读取错误的 '\n'?
【发布时间】:2012-10-11 09:06:19
【问题描述】:

一种糟糕的字节存储方式:
我在文件中存储了大约一些字节。字节由任意位(1 或 0)组成。
大约十个字节形成一个日志项。我在日志末尾添加一个“\n”
后来当我从文件中读取时(文件以文本格式存储和读取)。
我发现日志的一些两个字节组成了一个 '\n'(0x0d,0x0a)
但是我使用文件流的'readLine()'来读取文件的内容,显然无法识别正确的行尾。
我得到的结果是一堆,但是有没有更好的方法来存储字节(包含任意 1 或 0)并从文件中读取?
我在qt中使用c++,如果可以的话IDE下的解决方案应该会更好。

我的英语很差。感谢您的耐心阅读!

【问题讨论】:

  • 混合二进制和文本对我来说听起来像是灾难的秘诀。为什么不定义每次读取 N 个字节的固定格式?

标签: c++ file function


【解决方案1】:

我怀疑您使用的是 Windows,并且您正在以文本模式写入并以二进制模式读取。

在 Windows 上保存到文件系统的文本文件应该在行尾有 \r\n (0x0d,0x0a)。当有 \n 时,以文本模式写入会自动添加 \r。以文本模式阅读将删除 \r,因此您永远不会看到它。

如果您以相同的模式(文本或二进制)读取和写入,那么您将看到与写入相同的数据。在 linux 上,文本模式和二进制模式没有区别,但你应该选择正确的模式以保持代码的可移植性..

如果这是一个二进制文件(听起来你是在写字节而不是字符串),那么你可能应该使用二进制模式来读写。

【讨论】:

  • 在我的日志项中,首先有一些字符串(长度不确定),然后是11个字节,如何存储和读取日志项? ;) 感谢阅读!
  • 有很多方法可以做到这一点。通常,每个字符串的末尾都有一个分隔符。 \0 例如由 C/C++ 内部使用。您可以使用任何其他未出现在数据本身中的分隔符。如果分隔符确实出现在数据中,您可以对其进行转义,或者您可以在读取之前将字符串的长度写入文件。
【解决方案2】:

您可以使用special character 代替'0',然后存储到文件并在行尾添加'\n'。 试试这个,它可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2022-09-27
    • 2016-11-22
    • 2019-09-20
    • 2020-10-24
    • 2016-02-02
    • 1970-01-01
    • 2020-09-06
    • 2011-06-06
    相关资源
    最近更新 更多