关键词搜索

源码搜索 ×
×

二进制文件和文本文件究竟有什么区别?(内附小实验和C语言中fwrite fread fprintf fscanf函数的用法)

发布2012-11-03浏览10034次

详情内容

      先来做两个个小小的实验:

      实验一:

      首先,用鼠标右键新建一个文本文档,取名去test.txt, 在里面写一个0, 然后关闭.

      然后,用UltraEdit打开test.txt, 用十六进制观察,发现是0x30(十进制数值是48) .

      可见,0在test.txt文件对应的硬盘中存得实际比特是00110000

      沉思中......

 

       实验二:

       运行下面程序:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. FILE *fp = fopen("test", "wb");
  5. fputc(48, fp);
  6. fclose(fp);
  7. return 0;
  8. }

     用鼠标右击test文件,选择记事本打开方式,发现结果为0.
     沉思中......

 

 

       写文件的本质是编码,读文件的本质是解码 . 写读二进制文件和写读文本文件其实就是两套不同的编解码方式,仅此而已. 下面用程序来说明:

 

       写读二进制文件程序:

  1. #include<iostream>
  2. #define N 10000
  3. using namespace std;
  4. void write()
  5. {
  6. int i, a[N];
  7. for(i = 0; i < N; i++)
  8. a[i] = i;
  9. FILE *fp;
  10. fp = fopen("myData", "wb");
  11. fwrite(a, sizeof(a), 1, fp);
  12. fclose(fp);
  13. }
  14. void read()
  15. {
  16. int a[N];
  17. FILE *fp;
  18. fp = fopen("myData", "rb");
  19. fread(a, sizeof(a), 1, fp);
  20. fclose(fp);
  21. int i;
  22. for(i = 0; i < N; i++)
  23. cout << a[i] << endl;
  24. }
  25. int main()
  26. {
  27. write();
  28. read();
  29. return 0;
  30. }



       写读文本文件程序为:

  1. #include<iostream>
  2. #define N 10000
  3. using namespace std;
  4. void write()
  5. {
  6. int i, a[N];
  7. for(i = 0; i < N; i++)
  8. a[i] = i;
  9. FILE *fp;
  10. fp = fopen("yourData", "w");
  11. for(i = 0; i < N; i++)
  12. fprintf(fp, "%d ", a[i]);
  13. fclose(fp);
  14. }
  15. void read()
  16. {
  17. FILE *fp;
  18. fp = fopen("yourData", "r");
  19. int i, a[N];
  20. for(i = 0; i < N; i++)
  21. fscanf(fp, "%d", &a[i]);
  22. fclose(fp);
  23. for(i = 0; i < N; i++)
  24. cout << a[i] << endl;
  25. }
  26. int main()
  27. {
  28. write();
  29. read();
  30. return 0;
  31. }


       从控制台上可以看到,上面两个程序的结果是完全相同的. 为了更好地理解二进制文件和文本文件的区别,可以比较下面三项: (此处不给出比较结果. 不理解时,运行程序,自己比较一下,印象更深刻.)

       1. myData和yourData两个文件的大小;

       2. 用记事本方式(或文本方式)打开myData和yourData, 看是否出现乱码.

       3. 用UltraEdit打开myData和yourData,对比一下结果.

 

       最后,通过一个极为简单的例子来看UltraEdit读取二进制文件时的显示规律, 程序为:

  1. #include<iostream>
  2. #define N 8
  3. using namespace std;
  4. void write()
  5. {
  6. int i, a[N];
  7. for(i = 0; i < N; i++)
  8. {
  9. a[i] = i - N/2;
  10. cout << a[i] << "\t";
  11. }
  12. cout << endl;
  13. FILE *fp;
  14. fp = fopen("myData", "wb");
  15. fwrite(a, sizeof(a), 1, fp);
  16. fclose(fp);
  17. }
  18. int main()
  19. {
  20. write();
  21. return 0;
  22. }


        控制台上的结果为: -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函数读取文件中所有整数的方法:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. FILE *fp = fopen("myData.txt", "w");
  6. fprintf(fp, "1 2 \n3 4 5 6 \n"); // \n为换行
  7. fclose(fp);
  8. int a;
  9. fp = fopen("myData.txt", "r");
  10. while(EOF != fscanf(fp, "%d", &a))
  11. cout << a << endl; // 读取文件中所有的整数
  12. fclose(fp);
  13. return 0;
  14. }


 

       

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载