C 是如何将信息存储到文件中的呢?

How does C store the information into a file really?

在下面的简单代码中,我将一个整数 (10) 写入一个文件,然后将其读回以确保它已成功完成并且确实如此。然而,当我打开文件时(尝试了 notepad++ 和 vscode),我看到了这样的东西:


???

代码如下:

int main(){

    int var = 10;
    FILE* fp = fopen("testfile","w");
    rewind(fp);
    fwrite(&var,sizeof(int),1,fp);

    fflush(fp);
    fclose(fp);

    int var2 = 0;

    fopen("testfile","r+");
    fread(&var2,sizeof(int),1,fp);

    printf("num: %d\n",var2);

return 0;
}

当然我想可能是用一种特殊的格式写的vscode无法识别,但最近我学会了编写一个简单的数据库,它使用同样的方式来保存文件中的记录和当你用 vscode 打开它的输出文件时,它显示了 ???s 和信息,然而,这里它只显示 ???s 而没有信息。所以虽然这看起来是一个非常基本的问题,但我找不到它的答案,那么 10 是如何真正存储在那个文件中的呢?提前致谢。

您正在编写一个二进制文件。它不能用编辑器阅读。值 10 可能存储为 0x0000000A0x0A000000 之类的东西,具体取决于系统是大端还是小端。

但关键是它是以二进制格式而不是文本格式存储的。

如果您在文本编辑器中打开此文件,它可能会被解释为三个 NULL 字符,然后是一个 LF(换行)字符。

当您使用 fwrite 写入文件时,它会读取构成 var 的原始字节并将其写入磁盘。这是数字的二进制表示

如果您使用像 od 这样的工具,它会打印出文件包含的字节数:

[dbush@db-centos7 ~]$ od -tx1 testfile 
0000000 0a 00 00 00
0000004

你可以看到这里第一个字节包含值10,接下来的3个字节包含值0。这告诉我们一个int占用4个字节并且以小端格式存储,意思是最低有效字节在前。

如果您改为使用 fprintf 来写入值:

fprintf(fp, "%d\n", var);

它会将文本表示写入文件。该文件将如下所示:

[dbush@db-centos7 ~]$ cat testfile 
10
[dbush@db-centos7 ~]$ od -tx1 testfile 
0000000 31 30 0a
0000003

我们可以在这里看到打印文件显示可读文本,od 向我们显示字符 '1''0' 的 ASCII 代码以及换行符。