【问题标题】:How to change EOL coding in txt files?如何更改 txt 文件中的 EOL 编码?
【发布时间】:2012-01-05 21:32:00
【问题描述】:

我在 Visual Studio 2008 中使用 C++ 编写,但我在使用其他库时遇到问题 - 它们不接受我使用我的 txt 文件生成的行尾 (EOL)。

如何在使用

写入文件时更改它
std::ofstream myFile;
myFile.open("traindata.txt");
myFile << "stuff" << endl;
// or 
//myFile << "stuff" << '\n';
myFile.close();

编辑 2:

好的,我在代码中犯了一个错误:我为每次迭代都附加了“0”,这样我在 EOL 之前就有了空格。

糟糕。你们是对的。感谢您的帮助。

【问题讨论】:

  • 您的代码生成了哪些行尾?这些“其他库”期望哪些行尾?
  • @GregHewgill 我不确定生成的是哪一个,但我需要 LF。
  • 当您在 Windows 上使用 endl\n 时,它会在文本模式下自动转换为 CRLF。
  • 我建议您熟悉十六进制编辑器,这样您就可以 (a) 找出您现在正在生成的内容,并且 (b) 确保您在更改代码时做了正确的事情.
  • @Jesse 那么我该怎么做才能获得 LF 呢?我试过myFile.open("traindata.txt", std::ios_base::out|std::ios_base::binary);,但没有成功:(

标签: c++ file eol


【解决方案1】:

您是否可能只是不希望 \n 到行尾的序列发生?使用std::ios_base::binary 打开您的文件:这正好关闭了转换。 ...并且不要使用std::endl,除非你真的想刷新流:

std::ofstream myFile("traindata.txt", std::ios_base::binary);
myFile << "stuff\n";

close() 通常也是不必要的,除非您想检查它是否成功。

【讨论】:

  • 不知何故,我似乎记得 std::endl 在应用于文本文件时不会刷新缓冲区,但我只能找到 100% 确认您在此处陈述的内容。
【解决方案2】:

您应该以二进制模式打开文件流,以防止 C++ 库自动转换行尾:

myFile.open("traindata.txt", std::ios_base::out|std::ios_base::binary);

这将使 C++ 库无法将 '\n' 转换为特定于操作系统的 EOL 符号(在 Windows 上为 CR-LF)。

【讨论】:

    【解决方案3】:

    下载notepad++——应该可以解决问题。

    或者dos2unixunix2doscygwin

    【讨论】:

      【解决方案4】:

      使用 myfile &lt;&lt; "\r\n" 作为 Windows 风格的结尾,或使用 myfile &lt;&lt; "\n" 作为 UNIX 风格的结尾。

      【讨论】:

      • 这不是一个完整的答案,因为在 Windows 上,将 "\n" 写入文本文件会默默地转换为 "\r\n"
      • -1。在 Windows 上使用 myfile &lt;&lt; "\n" 仍会产生 CRLF 行结尾,因为文件是以文本模式打开的。替换在低级文件服务中执行。
      • @GregHewgill \n 怎么样?
      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2016-02-13
      相关资源
      最近更新 更多