gpt4 book ai didi

c - `fgetc` 、 `fputc` 、 `fgets` 和 `fputs` 需要以文本模式打开的文件,而 `fread` 和 `fwrite` 需要以二进制模式打开的文件吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:30 25 4
gpt4 key购买 nike

当对文件使用fgetcfputcfgetsfputs 时,我需要确保我以文本模式而不是二进制模式打开文件?

当使用 freadfwrite 时,我是否需要以二进制模式而不是文本模式打开文件?

在 Linux 中,我想没有区别。但是,如果在我目前无法访问的 Windows 中怎么办?

最佳答案

[在 Windows 下使用 mingw 尝试编辑]

text 和 binary mode 的区别只存在于 Windows 下,不仅涉及 fwritefread,还涉及 fgetc/fputc /.../_read/_write

在文本模式下,如果文件包含序列\r\n,当您阅读时,只有\n 被获取,如果文件不包含\r。在二进制模式下,返回两个字符。备注fread Microsoft Docs_read Microsoft Docs谈论那个案例,但不幸的是,在 fget fgetwc Microsoft Docs 中没有提到 fgetc

在写入时,如果流以文本模式打开,则每个\n 都被写入一个\r\n 对。请注意,替换对 fwrite 返回的大小没有影响。在二进制模式下,\n 是不变的,没有添加\r。备注fwrite Microsoft Docs_write Microsoft Docs谈论那种情况,但不幸的是,在 fputc fputwc Microsoft Docs 中没有提到 fputc

好在windows下的text mode读写函数是对称的,当你在text mode下写foo\nbar然后你读取生成的文件还是在text mode下你得到foo\nbar,但是有foo\r\nbar into文件。

所以

When using fgetc, fputc, fgets and fputs for a file, do I need to ensure that I have opened the file in text mode not binary mode?

模式有影响

When using fread and fwrite, do I need to opened the file in binary mode not text mode?

与其他功能一样,这是您的选择,但如果文件也由其他工具读/写,则最好以文本模式打开,以防这些工具在读取时期望在\n 之前有\r或在写作时制作这对。当然你也可以用二进制方式打开,自己在\n前显式写一个\r。

如果文件仅供您使用 C 读/写,最好始终以二进制模式打开,以便文件中仅包含您明确要求的内容。如果您使用 ftell/fseek,则会强制执行此操作。

ftell Microsoft Docs 中所述ftell 和 _ftelli64 可能不会反射(reflect)以文本模式打开的流的物理字节偏移量,因为文本模式会导致回车换行转换。

fseek Microsoft Docs 中所述,fseek 最糟糕。 :

for streams opened in text mode, fseek and _fseeki64 have limited use, because carriage return-linefeed translations can cause fseek and _fseeki64 to produce unexpected results. The only fseek and _fseeki64 operations guaranteed to work on streams opened in text mode are:

  • Seeking with an offset of 0 relative to any of the origin values.

  • Seeking from the beginning of the file with an offset value returned from a call to ftell when using fseek or _ftelli64 when using _fseeki64.

关于c - `fgetc` 、 `fputc` 、 `fgets` 和 `fputs` 需要以文本模式打开的文件,而 `fread` 和 `fwrite` 需要以二进制模式打开的文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56331955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com