【问题标题】:End of the line delimiter conversion between Windows and LinuxWindows 和 Linux 之间的行尾分隔符转换
【发布时间】:2012-05-18 10:09:05
【问题描述】:

我需要读取在 Windows 中用 C++ 程序创建的 txt 文件,在 Debian Linux 上编译。不幸的是,我对行尾分隔符有疑问。我知道行尾指示符在 Linux 和 Windows 中是不同的。因此,在 Linux 中,我的 C++ 程序会读取类似“correct_line^M”的内容。

我的问题:如何在 Linux 中正确读取在 Windows 中创建的文件? 我是否需要手动将其转换为 Linux 表示(我想避免它)?

谢谢。

【问题讨论】:

  • 在哪个编辑器中?一个好的编辑器应该自动检测行尾。
  • 可能不是直接重复,但这里的答案适用:stackoverflow.com/questions/8689344/…
  • 只需编写您的程序以容忍任一行结尾。

标签: c++ linux


【解决方案1】:

你必须自己做。 (恕我直言,一个好的图书馆会这样做 如果以文本模式打开,则自动在filebuf 中。但是图书馆 我熟悉的不要。)

根据您正在做什么,这可能无关紧要。任何面向线的 无论如何,输入都应该接受尾随空格,以及额外的 0x0D 字符是空格。所以除了编辑,一般不会 问题。

如果要在写入文件时抑制多余的 0x0D(在 Windows),只需以二进制模式打开文件。就此而言,当 文件的可移植性是一个问题,打开文件通常是个好主意 以二进制模式文件,并写入协议中的任何约定 需要。 (使用两个字符序列0x0D,0x0A或多或少 标准,并且是大多数 Internet 协议指定的内容。)阅读时, 再次,以二进制模式打开,并编写代码以接受任何 通常的约定:两个字符序列 0x0D、0x0A 或 单个 0x0D 或单个 0x0A。 (这可以通过过滤来完成 流缓冲。)

【讨论】:

  • 您的回答引导我找到正确的解决方案。我编写了“ClearCR(string str)”函数,如果需要,它只是从字符串中删除 '\r'。该函数实际上只有一行:str.erase(std::remove(str.begin(), str.end(), '\r'), str.end())。也许它会对某人有所帮助。
  • @Viper 如果您在一个地方阅读所有内容,那肯定是最简单的解决方案。我经常使用Line 类:一个非常简单的std::string 包装器,带有一个调用std::getline 的operator>>(所以我可以将它与istream_iterator 一起使用)。在我的例子中,它提供了一个非常方便的地方来放置代码以去除'\r'。
【解决方案2】:

您可以运行dos2unix。它会转换您的文件。

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    相关资源
    最近更新 更多