fgetc
从流中获取字符(单次只能读入一个字符)
int fgetc ( FILE * stream );
参数说明:
stream: 这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。
返回值:
- 该函数以无符号 char 强制转换为 int 的形式返回读取的字符。
遇到文件末尾,返回EOF,同时设置一个状态,遇到文件未尾了,使用feof来检测这个状态。
遇到错误,返回EOF,同时也设置一个状态,遇到了错误,使用ferror来检测这个 状态
代码实例
- fgetc 读文件操作 从test.txt读取内容
#include<stdio.h> #include<stdlib.h> //fgetc 文件操作 int main() { FILE* pf = fopen("test.txt", "r"); //判断是否为空 if (pf == NULL) { perror("fopen:"); return 1; } //读文件 int ch = 0; int i = 0; for (i = 0; i < 26; i++) { ch = fgetc(pf); printf("%c ", ch); } //关闭文件 fclose(pf); pf = NULL; system("pause"); return 0; }
最终输出结果:
a b c d e f g h i j k l m n o p q r s t u v w x y z
fputs
字符串写入到指定的流 中,但不包括空字符。
int fputs ( const char * str, FILE * stream );
参数说明:
str: C字符串,包含要写入流的内容
stream: 指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。
返回值:
- 如果成功,则返回一个非负值。
在错误时,函数返回EOF并设置错误指示符
代码实例
- fputs 写一行数据
#include<stdio.h> #include<stdlib.h> //fputs 写一行数据 int main() { FILE* pf = fopen("test.txt", "w"); //判断是否为空 if (pf == NULL) { perror("fopen:"); return 1; } //写入一行数据到文件里 int ch = 0; fputs("abcdef", pf); //关闭文件 fclose(pf); pf = NULL; system("pause"); return 0; }
最终文件存储数据:
fgets
从流中获取字符串
char * fgets ( char * str, int num, FILE * stream );
参数说明:
1.str :指向复制读取的字符串的字符数组的指针。
2.num: 要复制到str的最大字符数(包括结束的空字符)。如果写10个num,最多读取9
个,因为一个放’\0’
3.stream: 指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。Stdin也可以用作从标准输入中读取的参数。
返回值:
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。
如果发生错误,返回一个空指针。
代码实例:
- fgets - 读一行数据 从文件test.txt 读取内容
#include<stdio.h> #include<stdlib.h> //fgets 读一行数据 int main() { FILE* pf = fopen("test.txt", "r"); //判断是否为空 if (pf == NULL) { perror("fopen:"); return 1; } //读文件 char ch[20] = { 0 }; fgets(ch, 7, pf); printf("%s\n", ch); //关闭文件 fclose(pf); pf = NULL; system("pause"); return 0; }
最终输出结果:
abcdef
fprintf
将格式化的数据写入流
int fprintf ( FILE * stream, const char * format, … );
参数说明
- stream: 这是指向 FILE 对象的指针,该 FILE 对象标识了流
- format: 该参数类型于printf一样使用
返回值:
如果成功,则返回写入的字符总数,否则返回一个负数。
代码实例:
- fprintf 格式化写入流
#include<stdio.h> #include<stdlib.h> struct S { int age; char name[20]; char adders[20]; }; //fprintf 格式化写 int main() { struct S s = { 12,"zhansan","guangzhou" }; FILE* pf = fopen("test.txt", "w"); //判断是否为空 if (pf == NULL) { perror("fopen:"); return 1; } //写入文件 fprintf(pf, "%d %s %s\n", s.age, s.name, s.adders); fclose(pf); pf = NULL; system("pause"); return 0; }
最终文件存储数据:
fscanf
从流中读取格式化数据
int fscanf ( FILE * stream, const char * format, … );
参数说明:
- stream: 这是指向 FILE 对象的指针,该 FILE 对象标识了流
- format: 该参数类似于scanf一样用
返回值:
- 如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返
回 EOF。
代码实例:
- fscanf 从流中读取格式化数据
#include<stdio.h> #include<stdlib.h> struct S { int age; char name[20]; char adders[20]; }; //fscanf 从流中读取格式化数据 int main() { struct S s; FILE* pf = fopen("test.txt", "r"); //判断是否为空 if (pf == NULL) { perror("fopen:"); return 1; } //读文件 fscanf(pf, "%d %s %s\n", &(s.age), s.name, s.adders); printf("%d %s %s", s.age, s.name, s.adders); fclose(pf); pf = NULL; system("pause"); return 0; }
最终输出结果:
12 zhansan guangzhou
fwrite
写入数据块到流(二进制的写入文件)
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
参数说明:
1.ptr:指向要写入的元素数组的指针,转换为const void *
2.size : 要写入的每个元素的字节大小。
Size_t是无符号整型
3.count: 元素的数量,每个元素的大小为size字节
4.stream: 这是指向 FILE 对象的指针,该 FILE 对象标识了流
返回值:
- 返回成功写入的元素总数。
如果此数字与count参数不同,则写入错误阻止函数完成。在这种情况下,将为流设置错误指示器(ferror)。
如果size或count中有一个为零,则函数返回零,错误指示符保持不变。
Size_t是无符号整型
代码实例:
- fwrite 二进制的写文件
#include<stdio.h> #include<stdlib.h> struct S { int age; float f; char adders[20]; }; //fwrite 二进制的写文件 int main() { struct S s = { 10,3.14,"guangzhou" }; //二进制的写要加上b FILE* pf = fopen("test.txt", "wb"); //判断是否为空 if (pf == NULL) { perror("fopen:"); return 1; } //二进制的写文件 fwrite(&s, sizeof(struct S), 1, pf); //关闭文件 fclose(pf); pf = NULL; system("pause"); }
test.txt存储的文件信息
因为是二进制的写入,二进制存储方式,看不懂很正常。guangzhong这个字符串以二进制的方式存放进去,和文本放进去的方式是一样的。
fread
从流中读取数据块 (二进制的读文件 )
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
参数说明:
1.ptr: 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
2.要读取的每个元素的大小,以字节为单位。
Size_t是无符号整型。
3.size_t count, 元素的个数,每个元素的大小为 size 字节
4.这是指向 FILE 对象的指针,该 FILE 对象标识了流
返回值:
- 返回成功读取的元素总数。
如果这个数字与count参数不同,则要么发生了读取错误,要么在读取时到达了文件末尾。在这两种情况下,都设置了正确的指示器,可以分别使用ferror和feof进行检查。
如果size或count中有一个为零,函数返回零,流状态和ptr指向的内容都保持不变。
Size_t是无符号整型。
代码实例:
- fread 二进制的读文件 (从test.txt里面把二进制内容读出来)
#include<stdio.h> #include<stdlib.h> struct S { int age; float f; char adders[20]; }; //fread 二进制的读文件 int main() { struct S s = { 0 }; //二进制的写要加上b FILE* pf = fopen("test.txt", "rb"); //判断是否为空 if (pf == NULL) { perror("fopen:"); return 1; } //二进制的读文件 fread(&s, sizeof(struct S), 1, pf); printf("%d %f %s", s.age, s.f, s.adders); //关闭文件 fclose(pf); pf = NULL; system("pause"); }
最终输出结果:
10 3.140000 guangzhou