在下面的简单代码中,我将一个int数(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个的呢?预先感谢。
答案 0 :(得分:2)
使用fwrite
写入文件时,它将读取组成var
的原始字节并将其写入磁盘。这是数字的二进制表示形式。
如果使用od
之类的工具,它将打印出文件包含的字节:
[dbush@db-centos7 ~]$ od -tx1 testfile
0000000 0a 00 00 00
0000004
您可以在此处看到第一个字节包含值10,下一个3包含值0。这告诉我们int
占用4个字节,并以little-endian格式存储,这意味着最小有效字节在前。
您改为使用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码以及换行符。
答案 1 :(得分:1)
您正在编写 binary 文件。无法使用编辑器读取。值10
可能以0x0000000A
或0x0A000000
的形式存储,具体取决于系统是大字节序还是小字节序。
但是关键是它以二进制格式而不是文本格式存储。
如果在文本编辑器中打开此文件,则该文件可能会解释为三个NULL字符,然后是LF(换行)字符。