Windows中的`fprintf()`和`fscanf()`是否需要以文本模式打开文件

时间:2019-05-28 09:44:40

标签: c windows io

在Windows的文本文件上使用fprintf()fscanf()时,与二进制模式相比,是否有必要或建议以文本模式打开文件?

答案是否取决于在Windows中使用Microsoft对标准C库或GNU Libc的实现?

2 个答案:

答案 0 :(得分:3)

在Windows中,二进制或文本模式根据行转换的结束而有所不同。

系统进行行尾转换(例如,通过低级POSIX writeread)。但这并不重要:行尾转换是在文本模式下执行的,而在二进制模式下则没有任何改变。

printf和其他格式设置函数最终调用处理该行结束转换的低级读取/写入/任何函数。

  • 当您在以文本模式打开的文件中写入换行符\n时,系统会在换行符之前添加一个\r字符。
  • 当您在以文本模式打开的文件中读取\n时,系统会删除换行符之前的\r字符。如果没有,它不会删除任何内容。如果有2个\r字符,则只会删除一个。

请注意,如果要编写不带\r字符的Linux兼容文本文件,以二进制模式编写文本文件会很有用。

答案 1 :(得分:2)

  

在Windows中对文本文件使用fprintf()和fscanf()时,与二进制模式相比,是否有必要或建议以文本模式打开文件?

fprintf / fscanf 基于低级函数 fputc / fgetc 等,因此该模式的管理文本/二进制遵循我们在Do fgetc, fputc, fgets and fputs require a file opened in text mode, and fread and fwrite require a file in binary mode?

中看到的相同规则
  

答案是否取决于在Windows中使用Microsoft对标准C库或GNU Libc的实现?

mingw libc在我的Microsoft libs中受支持,其行为是Microsoft libc之一,某些功能遵循ISO但不是GNU / gcc,这是一种实现,不是一种标准。请注意,通常Microsoft并不完全符合任何特定的POSIX标准(请参阅Compatibility in Microsoft Docs