今天我总结一下文件这一章的知识:
1.文件概述
文件(file)是指存储在外部介质上数据的集合。操作系统则是以文件为单位对数据进行管理的。C语言中文件是流式文件,即文件是一个字节流或二进制流,并以字节为单位进行存取。
根据文件中数据的存储方式,C 语言的文件可分为:文本文件(ASCII码文件)和二进制文件。
C语言中可采用“缓冲文件系统”和“非缓冲文件系统”来处理文件。
缓冲文件系统:系统自动在内存区为每一个正在使用的文件开辟一个缓冲区,数据的输入和输出都先经过缓冲区。
非缓冲文件系统:是指系统不自动为文件开辟缓冲区,而是由用户程序自己为文件设定缓冲区。
2.文件类型指针(FILE)
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //是文件的起始位置
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //缓冲区大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
3.文件基本操作
(1)文件读(fopen):主要功能是为需要打开的文件分配一个缓冲区,并返回该缓冲区的首地址。
fp = fopen("文件名","文件使用方式") //文件名:要打开的文件的名,文件使用方式:以何种方式打开文件
(2)文件关闭(fclose):就是使文件指针不再指向该文件,即使文件指针变量与文件“脱钩”。
fclose("文件指针")//如果fclose 函数关闭文件成功,则返回零值;如果fclose 函数关闭文件失败,则返回非零值 EOF(-1),EOF 为文件结束符。fclose 函数在程序结束以前先把文件缓冲区中的数据输出到磁盘文件, 然后才释放文件指针变量。
文件使用方式 | 含 义 |
---|---|
r(只读) | 为输入打开一个已存在的文本文件 |
w(只写) | 为输出创建新文件,(若文件已存在,则文件内容被清空) |
a (追加数据) | 只用于向已存在的文件的末尾添加数据 |
rb(只读) | 为输入打开一个已存在的二进制文件 |
wb(只写) | 为输出打开一个二进制文件。若文件不存在,则创建新文件 |
ab(追加) | 打开一个已存在的二进制文件,在文件尾追加数据 |
r+(读/写) | 为读写打开一个已存在的文本文件 |
w+(读/写) | 建立一个新文本文件。若文件已存在,则文件内容被清空 |
a+(读/写) | 保留已存在的文件,可以添加数据,也可以读取数据 |
rb+(读/写) | 为读写打开一个已存在的二进制文件 |
wb+(读/写) | 建立一个新的二进制文件,若文件已存在,则文件内容被清空 |
ab+(读/写) | 保留已存在的文件,可以添加数据,也可以读取数据 |
(3)fputc函数和fgetc函数
fputc函数:把一个字符写到文件中去
fgetc函数:从指定的文件读入一个字符
例1:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
char ch,filename[10];
printf("Input filename:");
scanf("%s",filename);
if(fp == NULL){
printf("Can't open this file!");
exit(0);
}
ch = getchar();
while((ch = getchar()) != '#'){
fputc(ch,fp);
}
fclose(fp);
getch();
return 0;
}
(4)fputs函数和fgets函数
fputs(str,fp)//将str指向的一个字符串,舍去结束标记‘\0’后写入fp所指向的磁盘文件上。
正确,则返回写入文件的实际字符数;错误,则返回EOF(-1)
fgets(str, n, fp)//从文件fp中读取n-1个字符在其后补充一个字符串结束标记‘\0’,组成字符串并存入str
指定的内存区,正确,则返回str对应的地址;错误,则返回NULL(0)
(5)fprintf函数和fscanf函数
int num;
float score;
FILE * fp1, *fp2;
fp1 = fopen("in.txt", "r");
fp2 = fopen("out.txt", "w");
scanf(fp1, "%d,%f", &num, &score);
fprintf(fp2, "%d,%6.2f", num, score);
(6)frewind函数
使位置指针重新返回文件开头。此函数没有返回值。调用形式:frewind(fp)
例2: 有一个磁盘文件file.txt,第一次将它的内容显示在屏幕上,第二次把它 复制到file2.txt文件上
#include <stdlib.h>
int main(){
FILE *fp1,*fp2;
char ch;
if((fp1 = fopen("file.txt","r")) == NULL){
printf("Can't open this file!");
exit(0);
}
if((fp2 = fopen("file1.txt","w")) == NULL){
printf("Can't open this file!");
exit(0);
}
while((ch = fgetc(fp1)) != EOF){
putchar(ch);
}
frewind(fp1);
while((ch = fgetc(fp1)) != EOF){
putchar(ch,fp2);
}
fclose(fp1);fclose(fp2);
return 0;
}
(7)fseek函数和随机读写
fseek(文件类型指针,位移量,起始点)//位移量:是指以起始点为基点向前移动的字节数。一般地,位移量用long
型数据;起始点:0 —文件开始,1 —当前位置2 —文件末尾
顺序读写——位置指针按字节位置顺序移动;
随机读写——位置指针按需要移动到任意位置进行读写
fseek (fp , 100 L , 0) ;
----将位置指针移到离文件头100个字节处
fseek (fp , 50 L , 1) ;
----将位置指针移到离当前位置50个字节处
fseek (fp , -10 L , 2) ;
---将位置指针移到离文件尾向前10个字节处
例3:a1.txt文件存放26个字母,要求先显示该文件中的所有内容,再显示奇数位中的所有字母。
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
char ch;
int i;
if((fp = fopen("a1.txt","r")) == NULL){
printf("Can't open this file!");
exit(0);
}
while((ch = fgetc(fp)) != EOF){
putchar(ch);
}
printf("\n");
frewind(fp);
while((ch = fgetc(fp1)) != EOF){
printf("%c",ch);
fseek(fp,sizeof(char),1);//从当前位置向下移动一个字节
}
fclose(fp);
return 0;
}
(8)fread函数和fwrite函数
fread(buffer , size , count , fp )//buffer:是一个指针,表示读入数据的存放起始地址和要输出数据的起始地址。
fwrite(buffer , size , count , fp )//size:表示要读写的字节数;count:表示要进行读写多少个 size 字节的数据项,
即读写的次数;fp:文件指针,应指向被操作的文件。
以上是我的学习分享总结,如有不足,希望指正!