问题描述
我试图将一个简单的字符串存储在以wb
模式打开的文件中,如下面的代码所示。现在,根据我的理解,字符串的内容应以二进制模式打开时应分别存储为0s
和1s
,但是当我在记事本中手动打开文件时,可以看到确切的字符串存储在文件中,而不是一些二进制数据。出于好奇,我尝试以文本模式读取此二进制文件。再次,该字符串完美地显示在输出中,没有任何随机字符。下面的代码解释了我的观点:
#include<stdio.h>
int main()
{
char str[]="Testing 123";
FILE *fp;
fp = fopen("test.bin","wb");
fwrite(str,sizeof(str),1,fp);
fclose(fp);
return 0;
}
所以我对此有三个疑问:
- 为什么在记事本中看到文件时,它没有显示一些随机字符,而是确切的字符串?
- 我们可以读取以二进制模式编写的文本模式的文件吗?
- 与上述问题不完全相关,但是我们可以使用诸如
fgetc
,fputc
,fgets
,fputs
,fprintf
,fscanf
之类的函数可以使用二进制模式和fread
,fwrite
之类的功能来使用文本模式?
编辑:忘记提及我在Windows平台上工作。
解决方法
- 在二进制模式下,文件API不会修改数据,而只是直接传递数据。
- 在文本模式下,某些系统会转换数据。例如,Windows在文本模式下将
\n
更改为\r\n
。 - 在Linux上,二进制和文本模式没有区别。
- 记事本将打印文件中的所有内容,因此即使您写入100%二进制数据,也有可能看到一些可读字符。