对文件的输入与输出
10.1 C文件的有关基本知识
什么是文件:
文件有不同的类型,在程序设计中,主要用到两种文件:
1)程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。
2)数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他外部设备)的数据,或在程序中供读入的数据。
操作系统把各种设备都统一作为文件来处理。
所谓“文件”一般指存储在外部介质上数据的集合。
输入输出是数据传送的过程,称为流(stream),即数据流。
C语言把文件看作是一个字符(或字节)的序列,即由一个一个字符(或字节)的数据顺序组成。
文件名:
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件标识包括3部分:
1.文件路径
2.文件名主干
3.文件后缀
如下:
D:\CC\temp\                 file.dat
文件路径            文件名主干  文件后缀
文件名主干的命名规则遵循标识符的命名规则。
文件的分类:
根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。
ASCII文件又称文本文件(text file),每一个字节放一个字符的ASCII代码。
ANSI C标准采用“缓冲文件系统”处理数据文件,所谓缓冲文件系统是指系统自动地在内存区为程序中第一个正在使用的文件开辟一个文件缓冲区。
定义一个指向文件类型数据的指针变量:
FILE *fp;
定义fp是一个指向FILE类型数据的指针变量。可以使fp指向某一个文件的文件信息区(是一个结构体变量),通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够到与它相关联的文件。
注意:指向文件的指针变量并不是指向外部介质上的数据文件的开头,而是指向内存中的文件信息区的开头。
10.2 打开与关闭文件
所谓“打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。
fopen函数打开数据文件:
ANSI C规定了用标准输入输出函数fopen来实现打开文件。
fopen函数的调用格式:
fopen(文件名,使用文件方式);
例如:
fopen(“a1”,”r”);
fclose函数关闭数据文件:
“关闭”就是撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。
关闭文件用fclose函数。fclose函数调用的一般形式:
fclose(文件指针);
如:
fclose (fp);
如果不关闭文件将会丢失数据。
fclose函数也带回一个值,当成功地执行了关闭操作,则返回值为0;否则返回EOF-1)。
EOF是文件读结束标志符。
10.3 顺序读写数据文件:
顺序读写需要用到库函数来实现。
向文件读写字符:
fgetc(fp);
    fp指向的文件读入一个字符
fputc(ch,fp);
    把字符ch写到文件指针变量fp所指向的文件中
向文件读写一个字符串:
fgets(str,n,fp);
    fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中。
fputs(str,fp);
    str所指向的字符串写到文件指针变量fp所指向的文件中。
用格式化的方式读写文件:
fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输入表列);
用二进制方式向文件读写一组数据:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:是一个地址。对fread来说,它是用来存放从文件读入的数据的存储区的地址。对fwrite来说,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址)。
size:要读写的字节数。
count:要读写多少个数据项(每个数据项长度为size)。
fp:FILE类型指针。
如:
fread(f,4,10,fp);
其中f是一个float型数组名(代表数组首元素地址)。这个函数从fp所指向的文件读入104个字节的数据,存储到数组f中。
在打开文件时指定用二进制文件,这样就可以用freadfwrite函数读写任何类型的信息。
如:
假设学生的数据已存放在磁盘文件中,可以用下面的for语句和fread函数读入40个学生的数据:
for(i=0;i<40;i++)
    fread(&stud[i],sizeof(struct Student_type),1,fp);
执行40次循环,每次从fp指向的文件中读入结构体数组stu的一个元素。
同样,以下for循环和fwrite函数可以将内存中的输出到磁盘文件中去:
for(i=o;i<40;i++)
    fwrite(&stud[i],sizeof(struct Student_type),1,fp);
freadfread和fwrite的区别或fwrite函数的类型为int型,如果freadfwrite函数执行成功,则函数返回值为形参count的值(一个整数),即输入或输出数据项的个数。
10.4 随机读写数据文件:
文件位置标记及其定位:
1.随机读写:
所谓“随机读写”,是指读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。即对文件读写数据的顺序和数据在文件中的物理顺序一般是不一致的。可以在任何位置写入数据,在任何位置读取数据。
2.文件位置标记的定位
①用rewind函数使文件位置标记指向文件开头
rewind函数的作用是使文件位置标记重新返回文件的开头,此函数没有返回值。
②用fseek函数改变文件位置标记
fseek函数的调用形式为:
fseek(文件类型指针,位移量,起始点);
“位移量”指以“起始点”为基点,向前移动的字节数。位移量应是long型数据(在数字的末尾加一个字母L,就表示是long型)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。