I /O 文件的操作

【摘要】C语言中我们必须要掌握
IO随着当前计算机的快速发展,文件越来越大,因此文件的需求也
I/O操作就是简单的从程序移进,移出字节的事情,因此这些字节流被称为
流。
绝大多数的流都是完全缓冲的,这就意味着“读取”和“写入”都是在一块被
称为:缓冲区的内存块来回复制数据。从内存中来回复制数据是特别快的
用于输出流的缓冲区的数据只有被写满的时候才会被刷新(fflush,物理写入)
到设备或文件,一次性把放满的缓冲区数据写入和逐片把程序产生的数据写入相对效率更高
流分为两种:文本流和二进制流
文本流在不同的系统实现不太相同
二进制流的字节完全丧失安装程序编写他们形式写入到文件和设备中。
而且完全根据他们从文件或设备读取的形式读入到程序中。

文件缓冲区
ANSI C标准采用“缓冲文件系统”处理系统文件,所谓缓冲文件系统是指系统自动地在内存区为程序中每一个
正在使用的文件开辟一个文件缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去
如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地把数据
送到程序数据区(给程序变量)

使用文件缓冲区的好处:可以让数据的读取操作不是过于频繁,可以提高程序效率
缺点:如果每次数据没有装满缓冲区,数据就不会被刷新,也不会将缓冲区中的数据送到数据程序区,因此,如果是一些规模较小的 I/O操作,我们必须手动的去刷新一下缓冲区,这样做可能会有些麻烦但是可以解决很多问题。

常用的刷新缓冲区的  函数是 fflush(stdout) ,刷新输入缓冲区的操作是 while(  ch =getchar() != '\n') 这里需要说明一下的就是
通常情况下的缓冲区都会使用行缓冲,即一行数据已满就进行写入操作,而'\n' 是作为一个换行标志出现的,所以也可以作为刷新缓冲区的一个小技巧,对了,还有一个刷新输入缓冲区的函数 fflush(stdin),但是一般不建议使用这个函数,因为它并没有 fflush(stdout)所带来的用处大
 

文件

在stdio.h 中定义了一个FILE 结构。FILE是一个数据结构,用于访问一个流,如果激活了
几个流,每个流都会对应一个FILE结构。对每一个ANSI C程序,至少打开三个流:标准输入std_in
标准输出 std_out 和标准出错 std_err

标准输入为:键盘设备
标准输出为:终端或屏幕
每个指针都会指向对应的一个文件,每个文件有且只有一个这样的指针,当文件进行
读写操作时,系统中的文件就会通过这个指针建立联系,从而完成相应的操作。当你要对
文件做的操作已经执行完之后,应该习惯性地关闭文件,然后将这个指针置空
,使指针与文件的联系中断,当你下次还要对这个文件进行操作时,应该重新进行定义。
文件的读写操作
当文件按照指定的工作方式打开,就可以执行文件的读写操作啦
之前已经说过,文件分为文本文件和二进制文件,因此,我们就通过这两种不同的文件格式来
实现相应的读写操作吧。
对于文本文件来说,我们可以按照字符读写也可以按照字符串读写
对于二进制文件来说,可以成块的读写或者格式化读写
1.读写字符
C语言中对文本文件进行读写操作的函数分别是 fgetc 和fputc,函数原型存储在
stdio.h 头文件中,这个头文件也称作标准输入输出文件。
格式为
int fgetc(FILE *stream)
#include<stdio.h>
#include<stdlib.h>
int main()
{
 FILE *fp;
 char ch,filename[10];
 printf("请输入所用的文件名:");
 scanf("%s",filename);
 if((fp = fopen(filename,"w"))== NULL)
 {
  printf("无法打开文件");
  exit(0);
 }
 ch=getchar();
 printf("请输入一个准备存储到磁盘的字符串(以#结束)\n");
 ch=getchar();
 while(ch !='#')
 {
  fputc(ch,fp);
  putchar(ch);
  ch=getchar();
 }
 fclose(fp);
 putchar(10);
 system("pause");
 return 0;
}

现在我们来玩一个高级一点的,先创建一个文件,将一串字符串写入到这个文件当中,然后再创建一个文件,将之前文件中写的东西再次写入新创建的另一个文件中,这就类似于Linux下的管道文件

#include<stdio.h>
#include<stdlib.h>

int main()
{
        FILE *in,*out;
	char ch,infile[10],outfile[10];

	printf("请输入duruwenjianming:");
	scanf("%s",infile);
        printf("qingshuruxieruwenjianming");
        scanf("%s",outfile);

	if((in = fopen(infile,"r"))== NULL)
	{
		printf("无法打开文件");
		exit(0);
        }
  
        if((out = fopen(outfile,"w")) == NULL)
        {
               printf("can not open file");
               exit(0);
        }

        while(! feof(in))
        {
          ch = fgetc(in);
          fputc(ch,out);
          putchar(ch);
          }
          putchar(10);
          fclose(in);
          fclose(out);
          return 0;
}
程序结果

最后我想说的就是,关于文件的操作,我觉得还是多练习才可以熟能生巧,还有一些不太常用的函数,我在博客里面没有说明,你们可以自己下去看书了解一下,毕竟知道的话说不定还是可以用上的。
注:

     本文作者也是新手,有什么纰漏的地方还望各位指正,一定虚心接受。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值