⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12.2.7 二进制文件和文本文件.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
字号:
12.2.7 二进制文件和文本文件
下面我们看一个文件写入时经常会遇到的一个问题。先将 File程序中 OnFileWrite和 OnFileRead
这两个函数中的已有代码注释起来。然后在 OnFileWrite函数中添加如例 12-9所示代码。 
例。 12-9 

void CFileView : :OnFileWrite() 
1. FILE *pFile=fopen("2. txt". "w"); 


2. 	char ch [3] ; 

3. 	ch[O]= ' a '; 


4. 	ch [1 ]=10 ; 
5. 	ch [2] = ' b' ; 
6. 	fwrite(ch , 1, 3 , pFile} ; 
7 . 	fclose(pFile} ; 
在上述如例 12-9所示代码中,重新定义了一个 FILE结构体指针: pFile,并调用 fopen函数得到相
应的 FILE结构体指针:接下来,定义一个包含三个元素的字符数组 ( ch ),并设置各个元素的值,
其中将第一个元素设置为 "a",第二个元素设置为 10,第三个元素设置为 " b"。读者应注意,在 C
语言中,整数与字符是可以互操作的。如果将一个整数赋给字符变量,实际上就是将该整数作为 
ASCII码赋给这个字符变量。同样,如果将字符赋给字符变量,实际上在内存中,该字符变量保存的
值仍是该字符的 Ascn码。对于整数 10来说,它实际上是换行符的 ASCII码。然后,上述如例 12-9
所示代码调用 fwrite函数将字符数组 ch中的数据写入文件。最后,调用 fclose函数关闭文件。
运行 File程序,单击【文件操作\写入文件】菜单项,可以看到 File程序目录下多了一个文件: 
2.txt,但是发现这个文件的大小是 4个字节,而我们刚才写入的只有 3个字节。我们可以以二进制
方式打开这个文件,结果如下所示 : 
000000 61 00 0自 62 a. .b 
其中61就是字符 "a"的ASCII码,但是字符 "b"的ASCII码, OA就是十进制数: 10。读者可以发现多
了一个OD字符,该字符实际上就是回车字符,也就是十进制数: 13。我们并没有写入这个字符,而
是系统在写入文件时自动加入的,从而将我们的文件变成了 4个字节。
接下来,再看一下读取2.txt文件时会发生什么样的情况。在File程序中实现读取2.txt文件的代码,
即在OnFileRead函数中添加如例 12-10所示的代码。
例12-10 

void CFileView: :OnFileRead () 
1. FILE *pFi1e=fopen ("2 . txt" , "r ") ; 

2. char ch [1 00 1 ; 

3. fread(ch ,1, 3,pFi1e); . 

4. ch [3 1 = 0 ; 

5. fc1ose(pFi1e); 

6. MessageBox (ch) ; 


在上述例12-10所示代码中,首先定义了一个 FILE指针: pFile,并利用fopen函数打开刚刚生成的
2.txt文件。因为我们先前在写入该文件时写入的是3个字节的数据,所以这里在读取时可以直接指
定读取的字节数: 3个字节,并将数组中第4个元素设置为 0,这样,从文件读取到的数据之后紧接
着就是字符:"\。",然后调用 fclose函数关闭文件。最后调用MessageBox函数显示读取到的数据。
运行File程序,单击【文件操作\读取文件】菜单项,可以发现读取操作是正确的。也就是说,虽然
这个文件的大小是4个字节,而我们只读取了3个字节就把其内容全部读取出来了。
在C语言中默认是按照文本方式打开文件的,下面我们在读取文件时,以另一种打开方式打开2.txt
文件:按照二进制的方式打开。即将上述例 12-10所示OnFileRead函数中调用fopen函数打开文件的
那行代码 (如例 12-10所示代码的第1行〉修改为: 
F工LE *pFi1e=fopen("2.txt" , "rb"); 
再次运行File程序,单击【文件操作\读取文件】菜单项,读者将可以看到这时只读取到一个字符: a。
读者可以在例12-10所示OnFileRead函数中文件读取代码(第3行代码)后设置断点,调试运行File程
序,当程序在设置的断点处停止时,可以看到 ch数组中的内容,即从文件中读取到的内容只有 "a",
后面是两个竖杠 (如图 12.8所示),实际上它们分别是OD和OAo而 "b"字符并没有被读取出来,因为
我们只读取了三个字节。通过上面两种打开文件的方式进行读取操作的结果,我们可以知道,以文
本方式和二进制方式读取文件是有明显的区别的。
图 12.8以二进制方式读取文件后得到的数据

这时,读者可能想到如果写入文件时也以二进制方式写入,那么这时文件的大小是多少呢?我们将如
例 12-9所示 OnFileWrite函数中调用 fopen函数打开文件的代码(即第 1行代码)修改为: 
FILE *pFile=fopen("2.txt" , "wb"); 
再次运行 File程序,单击【文件操作\写入文件】菜单工页,然后在 Fi1e程序所在目录下,可以看
到这时生成的 2 .txt文件的大小是 3个字节,而上面以文本方式写入时是 4个字节,比二进制方式
写入时多了一个字节。
实际上,文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。文件通
常分为二进制文件和文本文件。二进制文件是包含在 ASCII及扩展 ASCII字符中编写的数据或程序
指令的文件。一般是可执行程序、图形、图像、声音等文件。文本文件(也称为 ASCII文件 ):它的
每一个字节存放的是可表示为一个字符的 ASCII代码的文件。它是以"行"为基本结构的一种信息组
织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。
读者应注意,虽然我们在这里把文件分为二进制文件和文本文件,但实际上它们都是以二进制数据
的方式存储的,这里再一次强调:文件只是计算机内存中以二进制表示的数据在外部存储介质上的另
一种存放形式。对于文本文件来说,它只是一种特殊形式的文件,
它所存放的每一个字节都可以转换为一个可读的字符,就是先前我们用记事本打开程序生成的2.txt
文件时看到的 "a"和 "b"字符一样,它们是可读的。但是对于文件本身来说,在其存放数据时,实
际上是按照数据在内存中存放的方式来存放的。在内存中不会存放"a"和"b"这样的字符,存放的都
是它们的ASCII码: 61和62。这样,对于先前在程序中以二进制方式保存的文件,如果在记事本中打
开的话,结果如图 12.9所示,可以看到在字符气"和 "b"之间有一个小黑块,它实际上就是换行字
符 (ASCn码为 10)。
图 12.9在记事本中1J开二进制方式保存的文件 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -