二进制文件与文本文件
我们首先来看一个文件写入时经常遇到的一个问题。有一个cpp文件,程序代码如下:
编译运行该程序,可以看到程序目录下多了个文件:1.txt,但是发现这个文件的大小的4个字节(4 bytes),而我们刚刚写入的只有3个字节。我们可以以二进制方式打开这个文件,结果如下: 1
#include <stdio.h>
2![]()
3
void main()
4
{
5
FILE *pFile = fopen("1.txt", "w");
6
char ch[3];
7
ch[0] = 'a';
8
ch[1] = 10;
9
ch[2] = 'b';
10
fwrite(ch, 1, 3, pFile);
11
fclose(pFile);
12
}
#include <stdio.h>2

3
void main()4
{5
FILE *pFile = fopen("1.txt", "w");6
char ch[3];7
ch[0] = 'a';8
ch[1] = 10;9
ch[2] = 'b';10
fwrite(ch, 1, 3, pFile);11
fclose(pFile);12
}61 0D 0A 62
其中61是字符'a'的ASCII码,62是'b'的ASCII码,0A是十进制数:10。可以发现多了一个0D字符,该字符实际上就是回车字符,也就是十进制数:13。我们并没有写入这个字符,而是系统写文件时自动加入的,所以文件'1.txt'大小为4个字节。
接下来我们看看读取1.txt的情况。实现读取1.txt文件的代码如下:
1
FILE *pFile=fopen("1.txt","r");
2
char *pBuf;
3
fread(pBuf,1,3,pFile);
4
pBuf[3]=0;
5
fclose(pFile);
6
printf("%s\n", pBuf);
运行程序发现读取操作是正确的,虽然文件大小是4个字节,而我们只读取3个就把全部内容读出来了。
FILE *pFile=fopen("1.txt","r");2
char *pBuf;3
fread(pBuf,1,3,pFile);4
pBuf[3]=0;5
fclose(pFile);6
printf("%s\n", pBuf);而这里默认是以文本方式打开文件,我们现在用另一种方式:以二进制方式打开1.txt。将上述代码中的第一行改成这样:
FILE *pFile2 = fopen("1.txt", "rb");
运行后发现只有只有字母'a'和回车输出。调试时发现,读取的内容为'a',后面是两竖杠,实际上是0D和0A。这是因为我们以二进制方式读取,实际只读取了三个字节。这是,我们就会想到如果写入文件时也以二进制方式写入,那么文件大小是多少呢?代码如下:
1
#include <stdio.h>
2![]()
3
void main()
4
{
5
FILE *pFile = fopen("1.txt", "wb");
6
char ch[3];
7
ch[0] = 'a';
8
ch[1] = 10;
9
ch[2] = 'b';
10
fwrite(ch, 1, 3, pFile);
11
fclose(pFile);
12
}
#include <stdio.h>2

3
void main()4
{5
FILE *pFile = fopen("1.txt", "wb");6
char ch[3];7
ch[0] = 'a';8
ch[1] = 10;9
ch[2] = 'b';10
fwrite(ch, 1, 3, pFile);11
fclose(pFile);12
} 再次运行程序,这时看到生成的1.txt文件大小是3个字节。
要注意的是,虽然我们把文件分为二进制文件和文本文件,但实际上它们都是以二进制数据的方式存储的:文本只是计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。对于文本文件来说,它只是一种特殊形式的文件,它所存放的每一个字节都可以转换为一个可读的字符。就是对于文本本身来说,在其存放数据时,实际上是按照数据在内存中存放的方式来存放的。在内存中不会存放'a'和'b'这样的字符,存放的都是它们的ASCII码:61和62。


浙公网安备 33010602011771号