一、C文件的相关概念
- 文件是指存储在外部介质上的数据的集合,在c程序中主要分为两种文件,一是程序文件,如文本文件(.txt),数据文件(.dat),C语言源程序文件(.c),C++文件(.cpp),目标文件(.obj),可执行文件(.exe),图像文件(.jpg)…等文件用于存放程序以便实现程序功能。二是数据文件,文件内容不是程序而是提供程序运行时读写的数据,如word文件(.doc),电子幻灯文件(.ppt)…等。
- 输入输出又称为流是数据传送的过程,表示信息从源到目的端的流动。一个输入输出流就是一个字节流又叫二进制流,输入输出流的开始与结束仅受程序控制不受物理符号(如回车符\t换行符\n)控制,这增加了处理的灵活性,称这种文件为流式文件。
- 一个文件有唯一的文件标识,以便用户识别与引用。文件标识包括三个部分,文件路径和文件名主干和文件后缀。文件路径标识文件在外部存储设备中的设置。文件名主干遵循标识符的命名规则,文件后缀用于表示文件性质,一般不超过三个字符。如
- 操作系统是以文件为单位对数据进行管理的,每一个与主机相连的输入、输出设备看作是一个文件。例如,终端键盘为输入文件,显示屏和打印机为输出文件。
- 按数据的组织形式数据又可以分为ASCII文件和二进制文件。
ASCII文件又叫文本文件,一个字节代表一个ASCII代码,因此便于对字符进行逐个处理和输出字符。但一般占存储空间较多,而且要花费转换时间。
二进制文件把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。因此可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般作为中间结果的数据需要暂时保存在外存上,以后又需要输入内存的,常用二进制文件保存。
把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间,对二进制文件的读写不存在这种转换。 - C语言采用缓冲文件系统处理文件,缓冲文件系统是指系统自动地在内存区为每个正在使用的文件开辟一个文件缓冲区。用缓冲文件系统进行的输入输出又称为高级磁盘输入输出。非缓冲文件系统则是系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统进行的输入输出又称为低级输入输出系统。
二、文件的打开与关闭
- 文件类型指针简称文件指针,每个被使用的文件都在内存区开辟一个相应的文件信息区用于存放文件的相关信息。而这些信息存放在一个结构体变量中。
- FILE *fp;//定义指向文件类型的结构体指针变量
- 文件指针=fopen(文件名,"文件使用方式”) ;//打开文件 , r只读已有文件 w只写新或已有文件 a添加数据 , 加b表示打开二进制文件,加+表示可读可写
- fclose(文件指针);//关闭文件
# include<stdio.h>
# include <stdlib.h>
//例10.1
int main(){
FILE *fp;//定义文件类型的指针
char ch,filename[10];
printf("请输入文件名:");
scanf("%s",filename);
if(!(fp=fopen(filename,"w"))){//打开ASCII文件并写入
printf("打不开文件\n");
//system("");//系统暂停黑色窗口
exit(0);//终止程序
}else{
printf("打开文件了!\n");
}
ch=getchar();//ch用于接收scanf语句时最后输入的回车符\t
printf("请输入打算存入文件中的字符串:");
ch=getchar();//接收从键盘输入的第一个字符
while (ch!='#'){//以#为字符串结束符或(ch!=EOF)ctrl+z ctrl+z
fputc(ch,fp);//将字符写入指针所指向的文件里
//ch=fgetc(fp);//读取文件的字符
putchar(ch);//输出在屏幕上
ch=getchar();//再接收 #
}
fclose(fp);//关闭文件 ,文件指针变量不再指向该文件,即关闭文件与该指针的联系。
putchar(10);//输出换行符
/*
file1.dat
computer and c#
computer and c
*/
return 0;
}
三、文件的顺序读写
向文件读写字符
- 字符=fgetc(文件类型指针);//打开文件
- fputc(字符,文件类型指针);//写入文件
# include<stdio.h>
# include <stdlib.h>
//例10.2
int main (){
FILE *f_pic,*f_file,*f_finish;
char ch,pic_name[20],file_name[20],finish_name[20];
printf("请输入需要合成的图片名称:\n");
scanf("%s",pic_name);
printf("请输入需要合成的文件名称:\n");
scanf("%s",file_name);
printf("生成的文件名称:\n");
scanf("%s",finish_name);
if(!(f_pic=fopen(pic_name,"rb"))){//打开以二进制形式文件图片读
printf("图片打不开");
return ; //或exit(0);
}
if(!(f_pic=fopen(file_name,"rb"))){//打开以二进制形式文件 读
printf("文件打不开");
return ;
}
if(!(f_pic=fopen(finish_name,"wb"))){//打开以二进制形式文件写
printf("文件打不开");
return ;
}
while(!(feof(f_pic))){//还未遇到文件的结束标志时
ch=fgetc(f_pic);//读取文件给字符 ch
fputc(ch,f_finish);//把字符信息写入给finish文件
}
fclose(f_pic);
while(!(feof(f_file))){
ch=fgetc(f_file);//读取文件给字符 ch
fputc(ch,f_finish);//把字符信息写入给finish文件
}
fclose(f_file);
fclose(f_finish);
system("pause");
return 0;
}
向文件读写字符串
- fgets(字符串,数组长度,文件类型指针);//读取文件
- fputs(字符串,文件类型指针);//写入文件
向文件格式化读写
fprintf(文件类型指针,“格式化字符串”,输出列表);
fscanf(文件类型指针,“格式化字符串”,&输入列表);
向文件读写二进制字符
fread();//以二进制形式读写
fwrite();
四、文件的随机读写
rewind();
fseek();