写入以文本模式打开但在二进制模式下不会发生的文件时会发生什么转换?特别是在MS Visual C.
unsigned char buffer[256];
for (int i = 0; i < 256; i++) buffer[i]=i;
int size = 1;
int count = 256;
Run Code Online (Sandbox Code Playgroud)
二进制模式:
FILE *fp_binary = fopen(filename, "wb");
fwrite(buffer, size, count, fp_binary);
Run Code Online (Sandbox Code Playgroud)
与文字模式:
FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);
Run Code Online (Sandbox Code Playgroud)
Jon*_*ein 49
我相信大多数平台在处理流时都会忽略"t"选项或"text-mode"选项.然而,在Windows上,情况并非如此.如果您在MSDN上查看fopen()函数的描述,您将看到指定"t"选项将产生以下效果:
MrZ*_*bra 28
在文本模式下,换行符"\n"可以转换为回车+换行符"\ r \n"
通常你想要以二进制模式打开.尝试在文本模式下读取任何二进制数据将无法正常工作,它将被破坏.您可以在二进制模式下读取文本正常 - 它不会自动将"\n"翻译为"\ r \n".
此外,当您使用"rt"打开文件时,输入将在Crtl-Z字符上终止.
另一个区别是当使用 fseek
如果流以二进制模式打开,则新位置正好是从文件开头(如果 origin 是 SEEK_SET)、从当前文件位置(如果 origin 是 SEEK_CUR)和从文件末尾(如果 origin 是 SEEK_END)测量的偏移字节。某些二进制流可能不支持 SEEK_END。
如果流在文本模式下打开,则 offset 的唯一支持值是零(适用于任何来源)和较早调用 std::ftell 在与同一文件关联的流上返回的值(仅适用于SEEK_SET 的起源。
尽管这个问题已经得到回答并清楚地解释过,但我认为用一个简单的代码示例来展示主要问题(\n 和 \r\n 之间的翻译)会很有趣。请注意,我没有解决文件末尾的 Crtl-Z 字符的问题。
#include <stdio.h>
#include <string.h>
int main() {
FILE *f;
char string[] = "A\nB";
int len;
len = strlen(string);
printf("As you'd expect string has %d characters... ", len); /* prints 3*/
f = fopen("test.txt", "w"); /* Text mode */
fwrite(string, 1, len, f); /* On windows "A\r\nB" is writen */
printf ("but %ld bytes were writen to file", ftell(f)); /* prints 4 on Windows, 3 on Linux*/
fclose(f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您在 Windows 上执行该程序,您将看到打印以下消息:
As you'd expect string has 3 characters... but 4 bytes were writen to file
Run Code Online (Sandbox Code Playgroud)
当然,您也可以使用 Notepad++ 等文本编辑器打开文件并查看字符:
在 Windows 上以文本模式读取文件时会执行逆转换。
| 归档时间: |
|
| 查看次数: |
33784 次 |
| 最近记录: |