片头
嗨!小伙伴们,大家好!在上一篇中,我们学习了C语言:文件操作(上),在这一篇中,我们将继续学习文件操作,准备好了吗?Ready Go ! ! !
文件的顺序读写
来复习一下这个表格
函数名 | 功能 | 适用于 |
fgetc | 字符输入函数/读 | 所有输入流(stdin-标准输入流和文件输入流) |
fputc | 字符输出函数/写 | 所有输出流(stdout-标准输出流和文件输出流) |
fgets | 文本行输入函数 | 所有输入流 |
fputs | 文本行输出函数 | 所有输出流 |
fscanf | 格式化输入函数 | 所有输入流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | 二进制输入 | 文件输入流 |
fwrite | 二进制输出 | 文件输出流 |
在上一篇中,我们学习了fgetc、fputc、fgets、fputs函数,今天我们来讲解后面几个函数~
1 fprintf函数
fprintf函数是C语言标准库中的一个输出函数,用于将格式化的数据输出到指定的文件中。
函数声明如下:
int fprintf( FILE* stream,const char* format,.......);
参数意义如下:
stream: 表示文件指针,用于指定输出的目标文件
format: 是一个格式化字符串,指定输出的格式
....... : 表示可变参数,用于提供要输出的数据
通过对比,我们可以观察到,fprintf函数和printf函数差不多, fprintf函数只不过多了一个参数FILE* stream,printf函数是将数据输出到标准输出流(stdout)【类似于:显示器界面(控制台)】,而fprintf函数是将数据输出到指向文件的指针stream(指针类型为 FILE*)中。
代码如下:
#include<stdio.h>
//创建一个结构体Stu
struct Stu {
char name[20];
int age;
float score;
};
int main() {
//定义一个结构体变量s,分别对属性进行初始化
struct Stu s = { "zhangsan",24,98.00000 };
//以“只写”的方式打开文件
FILE* pfwrite = fopen("data.txt", "w");
if (pfwrite == NULL) {
perror("fopen->pfwite");
return 1;
}
//将信息输出到流中
fprintf(pfwrite,"%s %d %.1f", s.name, s.age, s.score);
//关闭文件
fclose(pfwrite);
pfwrite = NULL;//置空
return 0;
}
运行结果如下:
fprintf函数的返回值是成功输出的字符数。如果出现错误则返回负数。函数会根据format字符串中的格式指示符,将可变参数列表中的数据按照指定的格式输出到文件中。
2 fscanf函数
fscanf函数是C语言标准库中的一个输入函数,用于从文件中读取格式化的数据。它可以根据给定的格式字符串从文件中读取数据,并将读取到的数据存储到对应的变量中。
函数原型如下:
int fscanf(FILE* stream, const char* format, ...);
参数说明:
- stream:指向要读取的文件的指针。
- format:格式化字符串,指定了要读取的数据的格式。
- ...:可变参数,用来接收读取到的数据的变量。
通过对比,我们可以发现,其实 fscanf 函数和 scanf 函数差不多,fscanf函数只不过多了一个参数FILE* stream,scanf函数是从标准输入流(从键盘中)读取数据,fscanf函数是从指向文件的指针stream(指针类型为 FILE*)中读取数据。
代码如下:
#include<stdio.h>
//创建一个结构体Stu
struct Stu {
char name[20];
int age;
float score;
};
int main() {
//定义一个结构体变量s,初始化为0
struct Stu s = { 0 };
//以“只读”的模式,打开文件
FILE* pfread = fopen("data.txt", "r");
//从文件中读取属性值
fscanf(pfread,"%s %d %f", s.name, &(s.age), &(s.score));
//在控制台上打印属性值
fprintf(stdout,"%s %d %.1f", s.name, s.age, s.score);
//关闭文件
fclose(pfread);
pfread = NULL;//置空
return 0;
}
运行结果如下:
这样,我们就成功地使用fscanf函数从文件中读取了数据。需要注意的是,fscanf函数会按照格式化字符串中的格式要求进行读取,如果格式不匹配,可能会导致读取错误或结果不正确。因此,在使用fscanf函数时,要确保格式化字符串与文件中的数据格式相匹配。
3 fwrite函数
fwrite函数是C语言中的一个文件操作函数,用于向文件中写入数据。
函数原型如下:
size_t fwrite( const void* ptr, size_t size, size_t count, FILE* stream);
参数含义如下:
ptr: 指向要写入的数据的指针
size: 每个数据项的大小(以字节为单位)
count: 要写入的数据项的个数
stream: 指向要写入的文件的指针
返回值: 成功写入数据的个数
fwrite函数将指定的数据写入文件,写入的数据来自指针ptr指向的内存区域。写入的数据项大小为size字节,总共写入count个数据项。函数调用成功后,返回实际写入的数据项个数,如果返回值与count不相等,可能是因为写入出错或到达文件末尾。
fwrite函数一般用于向二进制文件中写入数据,例如将内存中的结构体保存到文件中。它可以写入任意类型的数据,包括整数、浮点数、字符等。
代码如下:
//创建一个结构体Stu
struct Stu {
char name[20];
int age;
float score;
};
int main() {
//定义一个结构体变量s,分别对属性进行初始化
struct Stu s = { "zhangsan",18,95.00000 };
//以二进制的模式读和写
FILE* pf = fopen("data.txt", "wb");
if (pf == NULL) {
perror("pf");
return 1;
}
//二进制输出到流中
fwrite(&s, sizeof(s), 1, pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
运行结果如下:
4 fread函数
fread函数时C语言中的文件输入函数,用于从文件中读取指定数量的数据项,并将其存储到指定的内存块中。它的函数原型如下:
size_t fread(void* ptr,size_t size,size_t count,FILE* stream)
参数说明:
ptr: 指向存储数据的内存块的指针。
size: 每个数据项的字节数。
count: 要读取的数据项的数量
stream: 文件指针,指向要读取的文件。
返回值:为实际读取的数据项数量。
fread函数按照指定的size和count来计算要读取的总字节数,并将这些字节从文件中读取到ptr指向的内存块中。读取的位置随着每次读取而向后移动。
fread函数常用于读取二进制文件,可以读取任意类型的数据。读取字符串时,需要注意字符串结束标志'\0'字符,因为fread函数不会自动追加字符串结束符。
代码如下:
//创建一个结构体Stu
struct Stu {
char name[20];
int age;
float score;
};
//定义一个结构体变量s,初始化为0
int main() {
struct Stu S = { 0 };
FILE* pf = fopen("data.txt", "rb");
if (pf == NULL) {
perror("pf");
return 1;
}
//以二进制的形式读文件
fread(&S, sizeof(S), 1, pf);
//输出属性值
printf("%s %d %f\n", S.name, S.age, S.score);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
运行结果如下:
片尾
今天我们学习了另外4个函数,分别是fprintf函数,fscanf函数,fwrite函数,fread函数,希望看完这篇文章能对友友们有所帮助!!!
求点赞收藏加关注!!!
谢谢大家!!!