【问题标题】:How read Linux or Mac created file in Windows via C FILE*?如何通过 C FILE* 在 Windows 中读取 Linux 或 Mac 创建的文件?
【发布时间】:2011-06-24 04:19:36
【问题描述】:

众所周知,Windows 的 EOL 是 CRLF,Linux 的 EOL 是 Mac 的 CR。 (more_info)

我想编写一个程序,它可以在 Windows 中逐行读取 linux 和 Mac 以及 Win 文件。要打开文件,我会在“rt”模式下使用 fopen,但我不知道如何读取行。 fgets 在 Windows 下一直读取到 CRLF 和 LF,但我希望它也适用于 EOL=CR 文件。

那么解决方法是什么?提前致谢。

【问题讨论】:

  • Linux 使用 LF 而不是 CR。 MacOS9 使用普通 CR。
  • 是的,你是对的 PiotrLegnica mc-computing.com/languages/CR_LF.htm 这是整个列表。
  • @Mihran:MacOSX 使用 LF。
  • 我不敢相信人们仍然认为 Windows 需要 CRLF。即使是最新版本的记事本也只接受 LF 文件!为什么人们仍然编写发出非标准 CRLF 或 CR 行尾的软件?
  • 也许你是对的@André,但我希望我的程序能够处理由不同编辑器和不同操作系统创建和编辑的文件。

标签: c++ c file newline


【解决方案1】:

所以我找不到任何对我有用的东西,并决定编写自己的 my_fgets 函数,该函数在正文中使用 fgetc

【讨论】:

    【解决方案2】:

    要以“t”模式打开,文件必须符合您运行的平台。否则你只需要以二进制模式打开,然后自己解决差异。

    C 库帮助您编写在不同平台上运行大致相同的程序,但不支持“交叉读取”文件。

    【讨论】:

      【解决方案3】:

      只要您以 rt 模式(读取 - 文本)打开文件,就应该没问题。 fgets() 将返回一行,并将处理平台之间的细微差别。写入文件时,使用 '\n' 作为 EOL,您将获得适合您平台的正确行尾。这就是以文本模式打开文件的原因。如果使用二进制模式,则必须处理软件中所有不同的行尾。

      【讨论】:

      • 我正在通过 Windows 中的客户端程序从 Linux 服务器获取文件。这就是为什么在大多数情况下,我将读取的文件具有 linux 格式的 EOL。
      • @Mihran:没关系,差异将由流为您处理,所以不用担心......除非您想从 Windows 编写带有 Linux 行结尾的文件:)
      • 我试过了。它不起作用:( LF 和 CRLF 在 Windows 中有效,但 CR 不适用。没有在 Mac 和 Linux 中尝试过,但确定一切都会好起来的。
      • 大多数 C 库都实现通常所说的“通用换行模式”——如果文件不在平台的约定中,则无需换行!
      猜你喜欢
      • 2012-04-14
      • 2019-06-05
      • 2017-06-29
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多