2. 文件的读写
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
🔷注: 适用于所有输出流的意思-----即适用于文件流又适用于标准输出流。
⭐️⭐️ fputc
文本文件字符输出函数,用法与函数putchar
基本一样。
int fputs ( const char * str, FILE * stream );
分析:
名称 | 详情 |
头文件 | stdio.h |
返回值 | 整型(表示输出字符ASCII码,返回EOF表示输出失败) |
参数str |
待写入流字符 |
参数stream |
输出流(将字符写入目标流,如传文件指针输出至文件,传stdout输出至屏幕等) |
作用 | 在文件中输出一个字符 |
🔷举个栗子:
int main() { FILE* pf = fopen("F:\\test.txt", "w"); //打开文件 if (pf == NULL) { perror("fopen");//打印错误信息 } fputc('a', pf); fputc('b', pf); fputc('c', pf); return 0; }
🔷再举个栗子:
既然适用于所有输出流的意思,因此我们把它在标准输出流试看看:
int main() { FILE* pf = fopen("F:\\test.txt", "w"); //打开文件 if (pf == NULL) { perror("fopen");//打印错误信息 } fputc('a', stdout); fputc('b', stdout); fputc('c', stdout); return 0; }
⭐️⭐️ fgetc
文本文件字符输入函数,用法与函数getchar
基本一样。
int fgetc ( FILE * stream );
分析:
名称 | 详情 |
头文件 | stdio.h |
返回值 | 整型(表示输入字符ASCII码,返回EOF表示输入失败) |
参数FILE * stream |
输入流(从流中读取数据输入,传文件指针读取文件,传stdin读取键盘等) |
作用 | 在文件中输入一个字符 |
字符 |
🔷举个栗子:
int main() { FILE* pf = fopen("F:\\test.txt", "w"); //打开文件 if (pf == NULL) { perror("fopen");//打印错误信息 } //输入数据 fputc('a', stdout); fputc('b', stdout); fputc('c', stdout); //读文件(分别读三个) int ch = fgetc(pf); printf("%c ", ch); ch = fgetc(pf); printf("%c ", ch); ch = fgetc(pf); printf("%c ", ch); return 0; }
这个文件指针每读一次都会自动发生变化,因此能打印出abc.
⭐️注:由于fgets如果读取失败返回值为EOF,因此可以判断fgets的返回值来判断文件是否读取结束。
⭐️⭐️ fgets
char * fgets ( char * str, int n, FILE * stream );
分析:
int main() { FILE* pf = fopen("F:\\test.txt", "w"); //打开文件 if (pf == NULL) { perror("fopen");//打印错误信息 } char arr[20] = { 0 }; fputs("hello\n", pf); fputs("world", pf); fgets(arr, 20, pf);//fgets的使用 printf("%s\n", arr); pf = NULL; return 0; }
⭐️⭐️ fputs
int fputs ( const char * str, FILE * stream );
分析:
名称 | 详情 |
头文件 | stdio.h |
返回值 | 整型(返回EOF表示输出失败) |
参数str |
待写入流字符串 |
参数stream |
输出流(将字符写入目标流,如传文件指针输出至文件,传stdout输出至屏幕等) |
作用 | 输出一个字符串 |
int main() { FILE* pf = fopen("F:\\test.txt", "w"); //打开文件 if (pf == NULL) { perror("fopen");//打印错误信息 } fputs("hello\n", pf); fputs("world", pf); pf = NULL; return 0; }
⭐️⭐️ fscanf
分析:
名称 | 详情 |
头文件 | stdio.h |
返回值 | 整型(返回EOF表示输出失败) |
参数format |
待输出的流字符串 |
参数stream |
输入流 |
作用 | 输入多个字符串。fscanf 和scanf 的功能非常类似。 |
🔷举个栗子:
⭐️⭐️ fprintf
int fprintf ( FILE * stream, const char * format, ... );
分析:
名称 | 详情 |
头文件 | stdio.h |
返回值 | 整型(返回EOF表示输出失败) |
参数format |
待写入流字符串 |
参数stream |
输出流(将字符写入目标流,如传文件指针输出至文件,传stdout输出至屏幕等) |
作用 | 输出多个字符串。fprintf 和printf 的功能非常类似。 |
🔷举个栗子:
struct S { int n; double d; }; int main() { struct S s = { 0}; FILE* pf = fopen("F:\\test.txt", "r"); //打开文件 if (pf == NULL) { perror("fopen");//打印错误信息 } fscanf(pf, "%d %lf", &(s.n), &(s.d)); printf("%d %lf\n", s.n, s.d); fclose(pf); pf = NULL; return 0; }
⭐️⭐️ sprintf
sprintf
跟 printf
在用法上几乎一样,只是打印的目的地不同而已
int sprintf ( char * str, const char * format, ... );
分析:
🔷举个栗子:
#include<stdio.h> struct S { int a; float f; char name[10]; }; int main() { char a[100] = { 0 }; struct S s = { 100,3,14,"zhuzhu" }; //结构体转化成字符串 sprintf(a, "%d %lf %s", s.a, s.f, s.name); printf("%s\n", a); return 0; }
结果打印:
100 3.140000 zhuzhu
由此看出sprintf
可以把结构体这样带有格式化的数据内容转化成字符串。
⭐️⭐️ sscanf
sscanf
与scanf
类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源
int sscanf ( const char * s, const char * format, ...);
分析:
🔷举个栗子:
struct S { int a; float f; char name[10]; }; int main() { char a[100] = { 0 }; struct S s = { 100,3,14,"zhuzhu" }; struct S tmp = { 0}; sprintf(a, "%d %lf %s", s.a, s.f, s.name);//把一个格式化的数据转化成字符串 printf("%s\n", a); sscanf(a,"%d %lf %s",&(tmp.a),&(tmp.f),tmp.name);//把a字符串中的数据转化回格式化数据 printf("%d %lf %s\n", tmp.a, tmp.f, tmp.name); return 0; }