1.文件的顺序读写
1.1顺序读写的函数介绍
函数名 | 功能 | 适⽤于 |
fgetc | 字符输⼊函数 | 所有输⼊流 |
fputc | 字符输出函数 | 所有输出流 |
fgets | ⽂本⾏输⼊函数 | 所有输⼊流 |
fputs | ⽂本⾏输出函数 | 所有输出流 |
fscanf | 格式化输⼊函数 | 所有输⼊流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | ⼆进制输⼊ | ⽂件 |
fwrite | ⼆进制输出 | ⽂件 |
ps:关于我的个人理解,输入可以理解为读取,从文件里读取,从键盘上读取(输入);
输出可以理解为就是输出,将程序中编写的输出到屏幕,输出写入到文件中;具体我给出下面的代
码供大家理解;
1.1.1 fgetc:
1.1.1.1
由于这里是一“r”的方式打开文件,如果在绝对路径没有要操作的文件,就会报错,如下图
1.1.1.2
如果要操作的文件且该文件已经保存了99,fgetc就会从文件中读取一个字符,并返回该字符的ASCII码值,9的ASCII码值为57;
1.1.2 fputs
这里是以写的方式打开文件,所以如果没有该文件,会自动创建该文件;
fputs(const char *string, FILE *stream),第一个参数为一个要写入的字符串的地址,第二个参数
为操作该文件的文件指针,写入成功会返回一个非负的,正的,零的数字(我测试vs2022是返回
一个零),同时测得如果文件中有数据,新写入的数据会覆盖原来的,就i像前面写入的99,这个
程序执行完就只剩Hello World在文件中;
其余的我就不做过多的赘述,不妨自己动手试试。
2.文件的随机读写
相比较顺序读写,随机读写文件更自由,通俗来讲就是通过几个函数改变文件指针的位置,从而改变读写的内容,以下是几种方法:
2.1 fseek(int fseek( FILE *stream, long offset, int origin );)(成功返回0,否则返回非零)
Return Value
If successful, fseek returns 0. Otherwise, it returns a nonzero value. On devices incapable of seeking, the return value is undefined.(摘自msdn文档)
根据文件指针的位置和偏移量来定位文件指针。(offset代表要偏移的数量,比如1就是文件指针向后一位,origin代表文件指针起始位置)
//代码演示
#include<stdio.h>
int main() {
FILE* pf = fopen("test.txt","wb");
if (pf == NULL) {
perror("fopen");
return 1;
}
fputs("this is a c program",pf);
fseek(pf,2,SEEK_SET);//SEEK_SET文件最开始的位置,0
fputs("no no no",pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
由于这里是二进制形式写入,所以只能用二进制编译器打开文件,请看下图:
图一为只运行第一个fputs,图二为运行两个fputs,可以看到第二个插入的字符串就第一个字符串部分覆盖;
2.2 ftell
long ftell( FILE *stream );
返回文件指针的偏移量
2.3 rewind
void rewind( FILE *stream );
Repositions the file pointer to the beginning of a file.(将文件指针重新定位到文件的开头)
//演示代码
#include<stdio.h>
int main() {
FILE* pf = fopen("test.txt", "wb");
if (pf == NULL) {
perror("fopen");
return 1;
}
fputs("this is a c program", pf);
fseek(pf, 0, SEEK_END);//SEEK_END文件最后的位置
//这里是指向最后一个字母m之后的位置
long seek=ftell(pf);
printf("%d\n", seek);
rewind(pf);//让文件指针重新定位到文件最开始的位置
seek = ftell(pf);
printf("%d",seek);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
//执行结果