尝试在C中使用二进制模式将字符串存储在文件中

问题描述

我试图将一个简单的字符串存储在以wb模式打开的文件中,如下面的代码所示。现在,根据我的理解,字符串的内容应以二进制模式打开时应分别存储为0s1s,但是当我在记事本中手动打开文件时,可以看到确切的字符串存储在文件中,而不是一些二进制数据。出于好奇,我尝试以文本模式读取此二进制文件。再次,该字符串完美地显示输出中,没有任何随机字符。下面的代码解释了我的观点:

#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;
} 

所以我对此有三个疑问:

  1. 为什么在记事本中看到文件时,它没有显示一些随机字符,而是确切的字符串?
  2. 我们可以读取以二进制模式编写的文本模式的文件吗?
  3. 与上述问题不完全相关,但是我们可以使用诸如fgetcfputcfgetsfputsfprintffscanf之类的函数可以使用二进制模式和freadfwrite之类的功能来使用文本模式?

编辑:忘记提及我在Windows平台上工作。

解决方法

  • 在二进制模式下,文件API不会修改数据,而只是直接传递数据。
  • 在文本模式下,某些系统会转换数据。例如,Windows在文本模式下将\n更改为\r\n
  • 在Linux上,二进制和文本模式没有区别。
  • 记事本将打印文件中的所有内容,因此即使您写入100%二进制数据,也有可能看到一些可读字符。