一.什么是文件
1.程序文件:包括源程序文件(后缀为 .c),目标文件(后缀为 .o)以及可执行文件等。这种文件里的内容是程序代码。
2.数据文件:文件的内容不是程序,而是供程序运行时读写的数据,包括在程序运行过程中输出到磁盘的数据和在程序运行过程中供读入的数据。
数据文件分为ASCII 文件和二进制文件。
数据在内存中都是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件,可以认为就是内存数据的映像,称为映像文件。
如果要求在外存中以 ASCII 码形式存储,则需要在存储前进行转换。ASCII 文件又称为文本文件,每一个字节放一个字符的 ASCII 码。
(用二进制文件输出一个字节不一定代表一个字符,
用 ASCII 码形式输出时字节与字符一一对应,但占用空间较多,且转换时需要时间)
二.打开和关闭文件
1.打开文件是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)
fopen()
函数打开数据文件
fopen()
函数的调用方式为 fopen(文件名,使用文件的方式);
例如:
fopen("a1","r");
表示要打开名字为“ a1 ”的文件,使用文件的方式为“读入”(r 代表 read,即读入)。
fopen 函数的返回值是指向 a1 文件的指针(即 a1 文件信息区的起始地址)。通常将 fopen 函数的返回值赋给一个指向文件的指针变量。
如:
FILE *fp;
fp = fopen("a1","r");
2.“关闭”就是撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件。
fclose()
函数的调用方式:fclose(文件指针);
例如:
fclose(fp);
三.文件的输入和输出
1.顺序读写数据文件
在顺序写时,先写入的数据存放在文件中前面的位置,后写入的数据存放在文件中后面的位置。在顺序读时,读数据的顺序和数据在文件中的物理顺序是一致的。
对文本文件读入或输出一个字符的函数:
函数名 | 调用形式 | 功能 | 返回值 |
fgetc | fgetc(fp) | 从 fp 指向的文件读入一个字符 | 成功,带回所读的字符;失败则返回文件结束标志 EOF |
fputc | fputc(ch,fp) | 把字符 ch 写到文件指针变量 fp 所指向的文件中 | 输出成功,返回值就是输出的字符;输出失败,则返回 EOF |
例题:
从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“ # ”为止
#include<stdio.h>
#include<stdlib.h> // stdlib 头文件即 standard library 标准库头文件
int main(){
FILE * fp;
char ch,filename[10];
printf("Please enter the file name:");
scanf("%s",filename);
// 如果文件不存在,fopen 会建立该文件
if((fp=fopen(filename,"w"))==NULL){ // 打开输出文件并使 fp 指向此文件
printf("Unable to open this file\n"); // 如果打开出错,就输出“打不开”的信息
exit(0); // 终止程序
}
ch=getchar(); // 用来接收最后输入的回车符
printf("Please enter a string in the disk(Ends with a #):");
ch=getchar(); // 接收从键盘输入的第一个字符
while(ch!='#'){ // 当输入 # 时结束循环
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
putchar(10);
return 0;
}
2.随机读写数据文件
实现随机读写的关键是要按要求移动位置指针,也就是文件的定位。
rewind()
函数的调用形式为:rewind(文件指针);,它的功能是把文件内部的位置指针移到文件开头。
fseek 函数用来移动文件内部的位置指针,其调用形式为:fseek(文件指针,位移量,起始点);
“文件指针”指向被移动的文件;“位移量”表示移动的字节数,要求位移量是 long 型数据,以便在文件长度大于 64KB 时不会出错,当用常量表示位移量时,要求加后缀“ L ”;“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。
起始点 | 表示符号 | 数字表示 |
---|---|---|
文件首 | SEEK_SET | 0 |
当前位置 | SEEK_CUR | 1 |
文件末尾 | SEEK_END | 2 |
举例:
fseek(fp,100L,0);