- 打开文件 fopen();
- 关闭文件 fclose();
- 从文件中读取一个字符 fgetc();
- 从文件中写入一个字符 fputc();
- 从文件中读取一行 fgets();
- 向文件中写入一行 fputs();
- 检查文件是否结束 feof();
- fwrite()
- fread()
| 字符串 | 说明 |
| r(只读) | 以只读的方式打开文件,文件必须存在,不然会报错 |
| r+(读写) | 以读/写方式打开文件,该文件必须存在,不然会报错,(注:打开文件只进行读操作时不会清空文件原始数据,进行写入时会覆盖文件原始数据,重新写入数据) |
| rb(只读) | 为了读打开一个二进制文件,文件不存在将会报错(注:当使用rb打开文件进行写入的时候,由于是只读属性,所以写入不了,程序不会报错) |
| rb+(读写) | 为读和写打开一个二进制文件,文件不存在将会报错 |
| w(只写) | 为了写入打开一个文本文件,当文件不存在的时候将会创建新文件(注:文本文件中存在数据时将会清空) |
| w+(读写) | 为读和写打开一个文本文件,当文件不存在的时候将会创建新文件 (注:打开文本文件里面存在数据时将会清空) |
| wb(只写) | 为了写入打开一个二进制文件,当文件不存在的时候将会创建文件 |
| wb+(读写) | 为了读和写打开一个二进制文件,当文件不存在的时候将会创建 |
| a(追加) | 以写模式打开文件,在文件末尾添加内容,文件不存在将会创建 |
| a+(追加) | 在现有文件末尾添加内容,如果文件不存在则创建一个新文件,可以读整个文件,但是只能从末尾添加内容 |
| ab(追加) | 以写模式打开二进制文件,在文件末尾添加内容,文件不存在将会创建 |
| ab+(追加) | 以读写模式打开二进制文件,在文件末尾添加内容,文件不存在将会创建 |
| 函数 | 说明 |
| getc | int getc(FILE *stream),从文件流中读取字符,读到文件尾返回EOF (注:getc与fetc作用相同,但在某些库中getc为宏定义) |
| putc | int putc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。 |
| gets | char * gets(char *_Buffer),从标准输入读取字符串,但是次函数存在一个严重的缺陷,不会检查数组能不能装下,见代码片1 |
| puts | int puts(const char *s),将字符串输出到终端,输出遇到’ ‘也就是字符串的标志符才会停止,显示字符串时会自动在其后添加换行符 |
| fgetc | int fgetc(FILE *file);从文件中读取一个字符 |
| fputc | int fputc(int ch,FILE *file); 向文件中写入一个字符 |
| fgets | char *fgets(char *Buf,int MaxCount,FILE *file),从文件中读取MaxCount-1个字符,第MaxCount字符将会填充’ ‘,。如果fgets()在读到字符上限之前已读完一整行,它会把表示行结尾的换行符放在空字符前面。fgets()函数在遇到EOF时将返回NULL值,可以利用这一机制检查是否到达文件结尾;如果未遇到EOF则返回之前传给它的第一个参数地址。 |
| fputs | int fputs(const char * Str,FILE *file);向指定文件中写入一个字符串,写入失败返回-1,与puts函数不同的是,fputs在打印字符串时候不会在其末尾添加换行符 |
//代码片1
int main(int argc,char *argv[])
{
char buf[5];
gets(buf);
printf("%s",buf);
return 0;
}
//输入affection
//将会输出affection,但是实际buf的长度为5,导致gets访问未被分配的内存
//如果程序其他部分使用这个内存,则程序将会报错
一、fseek函数
int fseek(FILE * File, long Offset, int Origin);
第二个参数是偏移量
第三个参数是模式,模式有以下几种
- SEEK_SET 文件开始处
- SEEK_CUR 当前位置
- SEEK_END 文件末尾
eg. fseek(fp,0,SEEK_SET); //定位至文件开始处 fseek(fp,10,SEEK_SET); //定位至文件的第10个字节 fseek(fp,2,SEEK_CUR); //定位至当前位置往后2个字节 fseek(fp,0,SEEK_END); //定位至文件末尾 fseek(fp,-10,SEEK_END); //定位至文件末尾往前10个字节二、ftell函数
long ftell(FILE * _File);
它返回的是参数指向文件的当前位置距文件开始处的字节数。
三、fscanf函数int fscanf(FILE * stream,const char *format,[arugment...]);
在文件操作中的妙用:
比如有一个文件records.txt,文本内容为
学号 姓名 成绩
S001 Judy 80
S002 Cindy 78
S003 Helens 90
如果要将文本中的内容分割出来用数组保存就可以用fscanf这个函数
int main()
{
char id[10];
char name[10];
char score[10];
FILE * fp = fopen("F:\records.txt", "r");
if (fp == NULL)
{
perror("Open Fail");
}
else
{
fscanf(fp, "%s%s%s", id, name, score);
printf("id = %sn", id);
printf("name = %sn", name);
printf("score = %sn", score);
fclose(fp);
}
return 0;
}
//输出为
id = S001
name = Judy
score = 80
其中要注意的是id,name,score数组能够存储得下文本中的值,比如说当名字超过10个字符时,由于name表示的是首地址,可能在运行的时候不会报错,但是实际已经发生数组越界,当程序的其他部分使用越界部分的内存时,程序将会报错
四、fprintf函数int fprintf(FILE *fp,const char *format,[argument]);
//往文本中写入
S004 Dina 96
int main()
{
char id[10] = "S004";
char name[10] = "Dina";
char score[10] = "96";
FILE * fp = fopen("F:\records.txt", "a+");
if (fp == NULL)
{
perror("Open Fail");
}
else
{
fprintf(fp, "n%s %s %s", id, name, score);
printf("id = %sn", id);
printf("name = %sn", name);
printf("score = %sn", score);
fclose(fp);
}
return 0;
}
//文件中的内容变成了
S001 Judy 80
S002 Cindy 78
S003 Helens 90
S004 Dina 96



