先来做两个个小小的实验:
实验一:
首先,用鼠标右键新建一个文本文档,取名去test.txt, 在里面写一个0, 然后关闭.
然后,用UltraEdit打开test.txt, 用十六进制观察,发现是0x30(十进制数值是48) .
可见,0在test.txt文件对应的硬盘中存得实际比特是00110000
沉思中......
实验二:
运行下面程序:
#include<stdio.h> int main() { FILE *fp = fopen("test", "wb"); fputc(48, fp); fclose(fp); return 0; }
用鼠标右击test文件,选择记事本打开方式,发现结果为0.
沉思中......
写文件的本质是编码,读文件的本质是解码 . 写读二进制文件和写读文本文件其实就是两套不同的编解码方式,仅此而已. 下面用程序来说明:
写读二进制文件程序:
#include<iostream> #define N 10000 using namespace std; void write() { int i, a[N]; for(i = 0; i < N; i++) a[i] = i; FILE *fp; fp = fopen("myData", "wb"); fwrite(a, sizeof(a), 1, fp); fclose(fp); } void read() { int a[N]; FILE *fp; fp = fopen("myData", "rb"); fread(a, sizeof(a), 1, fp); fclose(fp); int i; for(i = 0; i < N; i++) cout << a[i] << endl; } int main() { write(); read(); return 0; }
写读文本文件程序为:
#include<iostream> #define N 10000 using namespace std; void write() { int i, a[N]; for(i = 0; i < N; i++) a[i] = i; FILE *fp; fp = fopen("yourData", "w"); for(i = 0; i < N; i++) fprintf(fp, "%d ", a[i]); fclose(fp); } void read() { FILE *fp; fp = fopen("yourData", "r"); int i, a[N]; for(i = 0; i < N; i++) fscanf(fp, "%d", &a[i]); fclose(fp); for(i = 0; i < N; i++) cout << a[i] << endl; } int main() { write(); read(); return 0; }
从控制台上可以看到,上面两个程序的结果是完全相同的. 为了更好地理解二进制文件和文本文件的区别,可以比较下面三项: (此处不给出比较结果. 不理解时,运行程序,自己比较一下,印象更深刻.)
1. myData和yourData两个文件的大小;
2. 用记事本方式(或文本方式)打开myData和yourData, 看是否出现乱码.
3. 用UltraEdit打开myData和yourData,对比一下结果.
最后,通过一个极为简单的例子来看UltraEdit读取二进制文件时的显示规律, 程序为:
#include<iostream> #define N 8 using namespace std; void write() { int i, a[N]; for(i = 0; i < N; i++) { a[i] = i - N/2; cout << a[i] << "\t"; } cout << endl; FILE *fp; fp = fopen("myData", "wb"); fwrite(a, sizeof(a), 1, fp); fclose(fp); } int main() { write(); return 0; }
控制台上的结果为: -4 -3 -2 -1 0 1 2 3
(-4的补码是FFFFFFFC)
用UltraEdit打开myData, 结果如下:
FC FF FF FFFD FF FF FF FE FF FF FF FF FF FF FF
00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00
可见,这些刚好是控制台上结果对应的补码(注意补码的高低位顺序).
既然讲到了fscanf函数,下面来介绍一个用fscanf函数读取文件中所有整数的方法:
#include<iostream> using namespace std; int main() { FILE *fp = fopen("myData.txt", "w"); fprintf(fp, "1 2 \n3 4 5 6 \n"); // \n为换行 fclose(fp); int a; fp = fopen("myData.txt", "r"); while(EOF != fscanf(fp, "%d", &a)) cout << a << endl; // 读取文件中所有的整数 fclose(fp); return 0; }