您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > c语言文件的输入输出
1C语言文件的输入与输出一.文件指针每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文什状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。在sudio.h文件中有以下的文件类型声明:typedefstruct{shortlevel;/*缓冲区“满”或“空”的程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/shortbsize;/*缓冲区的大小*/unsignedchar*buffer;/*数据缓冲区的位置*/unsignedchar*curp;/*指针,当前的指向*/unsignedistemp;/*临时文件,指示器*/shorttoken;/*用于有效性检查*/}FILE;在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FILE类型的区,存放文件的有关信息。2FILE类型的数组:FILEf[5];定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。有了文件指针类型,就可以用它来定义文件指针变量,用文件指针变量来访问文件,其形式为:FILE*指针变量名。例如:FILE*fp;其中fp是指向要访问文件的指针变量。例如,通过文件指针访问text.exe文件,有如下的访问:FILE*fp;fp=fopen(“text.exe”,“rb”);ch=getc(fp);第一行语句只定义了一个没有指向的文件指针fp,第二行是打开文件text.exe,并同时确定对访问文件的操作方式(此处对访问的文件只进行读操作),这时给文件结构中的成员信息赋值,并使fp指向text.exe文件,第三行是利用文件指针对文件进行操作,操作方式应当与打开文件时确定的方式一致(只读)。由此可以看出,操作文件过程中不出现对文件结构成员的访问语句。如果有n个文件,一般应设n个指针变量,使它们分别指向n个文件,确定打开方式,利用有关函数对文件指针操作即可。例如:下面语句定义了三个文件指针,在程序中就可以处理三个不同的文件。FILE*fa,*fb,*fc;3二.文件的打开与关闭2.1文件的打开(fopen函数)打开文件的首要工作就是要改变文件的标志,使其由闭到开,并且把下面信息告诉编译系统:①需要打开的文件名,也就是准备访问的文件的名字;②使用文件的方式(“读”还是“写”等);③让哪一个指针变量指向被打开的文件。打开函数的原型是定义在stdio.h头文件中的fopen函数,其格式为:fopen(“文件名”,“使用文件方式”);即:FILE=fopen(“文件名”,“使用文件方式”);例如:fp=fopen(“file”,“r”);它表示,要打开的文件名为file,操作方式为读入,fopen函数返回指向file文件的指针并赋值给指针变量fp,这样fp和文件file就建立了联系。文件名字符串允许带有路径,使用路径时,路径分隔符是“\”而不是“\\”。例如:FILE*fp,*fq;fp=fopen(“student”,“w”);fq=fopen(“D:liuli\student34”,“r”);4以上语句表明,在当前磁盘,当前目录下以只写方式打开一个新文件,并将该文件的内存存储的首地址赋予文件指针fp,再以只读方式打开D盘liuli子目录下名字为student34的已经存盘的旧文件,并将该文件的内存存储的首地址赋予文件指针fq。注意:如果fopen函数调用失败,即文件打开失败,fopen函数将返回空指针NULL,NULL在头文件中被定义为0.文件使用方式及含义文件操作方式含义打开文件方式“r”打开一个文本文件只读“w”打开一个文本文件只写“a”打开一个文本文件,向文本文件尾增加数据追加“rb”打开一个二进制文件只读“wb”打开一个二进制文件只写“ab”打开一个二进制文件,向二进制文件尾增加数据追加“r+”打开一个文本文件读/写“w+”建立一个新的文本文件读/写“a+”打开或生成一个文本文件读/写“rb++”打开一个二进制文件读/写5“wb++”建立一个新的二进制文件读/写“ab++”打开或生成一个二进制文件读/写说明:(1)用“r”方式打开文件的目的是为了从文件中读取数据,不能向文件写入数据,而且该文件应该已经存在,不能用“r”方式打开一个并不存在的文件;否则出错。(2)用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立个新文件。(3)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在;否则将得到出错信息。打开时,位置指针移到文件末尾。(4)用r+”、“w+”、“a+”方式打开的文件既可以用来输人数据,也可以用来输出数据。用r+”方式时该文件应该已经存在,以便能向计算机输人数据。用“w+”方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加,也可以读。(5)如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用r方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdio.H头文件中已被定义为0)。6常用下面的方法打开一个文件:if((fp=fopen(file,r))==NULL){printf(cannotopenthisfile\n);exit(0);//关闭所有文件,终止正在运行的程序}即先检查打开的操作有否出错,如果有错就在终端上输出cannotopenthisfile。exit函数的作用是关闭所有文件,终止正在执行的程序,待用户检查出错误,修改后再运行。(6)从文本文件中读取数据时,将回车符与换行符两个字符转换为一个换行符。在向文本文件中写入数据时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到磁盘中的数据形式完全一致。2.2、文件的关闭(fclose函数)在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。用fclose函数关闭文件。fclose函数调用的一般形式为:fclose(文件指针);例如:fclosc(fp);表示关闭由文件指针fp当前指向的文件,收回其占有的内存空间,7取消文件指针fp的指向。如果在程序中同时打开多个文件,使用完后必须多次调用fclose函数将文件逐一关闭。关闭成功返回值为0;否则返回EOF(-1)。如果不关闭文件将会丢失数据。因为,在向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。三.文件的读写1.单个字符的读写操作(fputc()和fgetc())3.1.1、fputs函数---字符的写操作用fputc函数可以把一个字符写到磁盘文件中去,其形式为:fputc(intch,FILE*fp)其中,ch为输出字符,它可以使一个字符常量,也可以使一个字符变量,fp是文件指针变量,它已经指向一个由函数打开的文件。函数功能:将字符(ch的值)输出到fp所指向的文件中去。如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF.83.1.2、fgetc函数---字符的读操作fgetc函数的原型定义在stdio.h头文件中,该函数可以从指定的文件读取一个字符,该文件必须是以读或读写方式打开的。其格式为:fgetc(FILE*fp);fp为文件型指针变量,fgetc函数带回一个字符。如果读到的是文本文件结束符,函数返回—个文件结束标志EOF(即-1)。如果想从一个文本文件顺序读入字符并在屏幕上显示出来,常见的读取字符操作为:ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}注意:EOF不是可输出字符,因此不能在屏幕上显示。由于字符的ASCll码不可能小于-1,因此EOF定义为-1是合适的。当读入的字符值等于-1(即EOF)时,表示读入的已不是正常的字符而是文件结束符。但以上只适用于读文本文件的情况,并不实用于处理二进制文件,因为读入某一个字节中的二进制数据的值有可能是-l,而这又恰好是EOF的值,这就会出现文件没结束但被判断结束的结果。为了解决这个问题.采用feof(fp)函数,feof(fp)用来测试fp所指向的文件当前状态是否“文件结束”。如果是文件结束,函数feof(fp)的值为1(真);否则为0(假)。9如果想顺序读入一个二进制文件中的数据。可以用从一个二进制文件顺序读入字符:while(!feof(fp)){ch=fgetc(fp);…………}3.1.3、fputc和fgetc函数使用举例例1:函数fputc的应用#includestdlib.h#includestdio.hvoidmain(void){FILE*fp;/*定义文件指针*/charch,filename[10];scanf(%s,filename);if((fp=fopen(filename,w))==NULL){printf(cannotopenfile\n);exit(0);/*终止程序*/}10ch=getchar();/*接收输入的第一个字符*/while(ch!=‘#'){fputc(ch,fp);putchar(ch);ch=getchar();}printf(\n);/*向屏幕输出一个换行符*/fclose(fp);}运行情况如下:file1.c(输入磁盘文件名)computerandc#(输入一个字符串)computerandc(输出一个字符串)文件名由键盘输入,赋给字符数组filename。fopen函数中的第一个参数“文件名”可以直接写成字符串常量形式(如file1.c).也可以用字符数组名,在字符数组中存放文件名(如本例所用的方法)。本例运行时从键盘输人磁盘文件名“filel.c”,然后输入要写入该磁盘文件的字符computerandc,“#”是表示输入结束。程序“computerandc”写到以“filel.c”命名的磁盘文件中,同时在屏幕上显示这些字符。11为了验证computerandc”是否写到以“filel.c”命名的磁盘文件中,我们可以对还磁盘中的内容进行读取操作,在在屏幕上显示磁盘中的内容。,则有例2.函数fgetc的应用#includestdlib.h#includestdio.hvoidmain(void){FILE*fp;/*定义文件指针*/charch;if((fp=fopen(file1.c,r))==NULL){printf(cannotopenfile1.c\n);exit(0);/*终止程序*/}ch=fgetc(fp);while(!feof(fp)){12putchar(ch);ch=fgetc(fp);}printf(\n);/*向屏幕输出一个换行符*/fclose(fp);}注:在stdio.h头文件中,用putc和fputc及用getc和fgetc是一样的。一般可以把它们作为相同的函数来对待。2.字符串的读写操作3.2.1、fgets函数fgets函数原型定义在stdio.h中,指从指定文件读入一个字符串。其格式为:fgets(char*str,intnum,FILE*fp);其中fp指向被读文件的指针变
本文标题:c语言文件的输入输出
链接地址:https://www.777doc.com/doc-3717410 .html