文件流和二进制流

C语言读写文件有两种方式ASCII 和 二进制。现在举例说明:

内存中的字符或字符串都是文本模式(unicode编码存储,统一长度,定长码,方便)
内存中的其他变量都是以二进制编码存储
程序的代码以文本模式ASCII码方式存储

 

fprintf写入非char型数据到文件,则文件为ascii类型(即文本文件);

fwirte写入非char型数据到文件,则文件为二进制文件;

 

 

1.windows系统中,文本模式下文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n"。读取的时候自动去掉\r,将\n写入内存。

2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行所以Linux系统中在文本模式和二进制模式下并无区别

 

fprintf则将二进制转换成ASCII输出到文件中,fscanf将读取的ascii码转换成二进制放到内存中

ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:
ASC码:00110101 00110110 00110111 00111000
      ↓        ↓       ↓         ↓
十进制码:   5     6      7       8 共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作"流式文件

 

在a.txt文件中输入:12 34 4 56 5,则打印出的也为12 34 4 56 5,因为使用fprintf将文件流中的数据按%d格式以字符流存入buf[i]中;

1 #include <stdio.h>
  2 #include <stdlib.h>
  3 int main ()
  4 {
  5     FILE *fd = fopen("./a.txt","r");
  6     int buf[5] = {0};
  7     for(int i=0;i<5;i++) {
  8         fscanf(fd,"%d",&buf[i]);
  9         printf("%d ",buf[i]);
 10     }
 11     printf("\n");
 12     return 0;
 13 }
~                  

 

 

打开b.txt可以正常显示1 2 3 4 5,因为将int型数据以%d的格式按字符流输入文件中;

#include <stdio.h>
  5 int main() {
  6     int arr[] = {12, 23, 34, 45, 56}, size = 0;
  7     FILE *p_file = fopen("b.txt", "w");
  8     if (p_file) {
  9        // size = fwrite(arr, sizeof(int), 5, p_file);
 10         for(int i=0;i<5;i++) {
 11             fprintf(p_file,"%d ",arr[i]);
 12         }
 13         printf("实际写入了%d个整数类型存储区\n", size);
 14         fclose(p_file);
 15         p_file = NULL;
 16     }
 17     return 0;
 18 }



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值