【C语言】探索文件读写函数的全貌(一)https://developer.aliyun.com/article/1617243
5.5 fgets()
【函数部分说明】:
功能上:
- 文本行输入函数,从流中获得字符串,直到读取到
num-1
个字符或者在达到换行符或文件末尾(前者为准)
。 - 换行符(\n)会使
fgets
停止,但函数将其视为有效字符,并包含在复制到str
的字符串中,在将字符复制到str
之后,会自动添加\0
,导致只能读取num-1
字符
参数部分上:
str:
- 指向复制字符串读取到char数组的指针(这里提前开辟好数组)
num:
- 复制到str中的最大字符数(包括‘\0’字符-字符串)
返回值:
- 成功,返回str指针,失败,返回
EOF
int main() { FILE* pf = fopen("test1.txt", "r"); if (pf == NULL) { perror("fopen fail!!!"); return; } char ch[1000]="xxxxxxx"; fgets(ch, 7, pf); printf("%s", ch); fclose(pf); pf = NULL; return 0; }
【说明】:给\0留了一个位置
5.6 fscanf和fprintf函数
fprint
和fscanf
属于格式化输入输出函数,将不同数据类型放在结构体中进行统一管理。
struct S { char a[1000]; int p; float pa; };
5.7 fprintf()
【函数部分说明】:
功能上:
- 按格式化数据写入流,如果format包含格式说明符(%开头的子序列),则格式化format后面的其他参数并将其插入到生成的字符串中,代替其各自的说明符.
- 根据格式说明符顺序,匹配不同类型对应的数据,输入到
text1.txt
中去。
返回值:
- 成功,返回写入字符总数,失败,则返回负数
int main() { struct S s={"zhangsan",100,4.3}; FILE* pf = fopen("test1.txt", "w"); if (pf == NULL) { perror("fopen fail!!!"); return; } fprintf(pf,"%s %d %f", s.a, s.p, s.pa); fclose(pf); pf = NULL; return 0; }
5.8 fscanf()
【函数部分说明】:
功能:
- 从流中读取数据,并根据格式将其存储到其他参数指向的位置。
- 该对象由格式化字符串的相应格式说明符指示。
- 根据格式说明符顺序,匹配
text1.txt
对应的数据,输入到对应的数据变量中
返回值:
成功后,该函数返回已成功填充的参数列表的项数,失败,EOF
int main() { struct S s;//这里没有初始化,目的是通过fscanf赋值 FILE* pf = fopen("test1.txt", "r"); if (pf == NULL) { perror("fopen fail!!!"); return; } fscanf(pf, "%s %d %f", s.a, &(s.p), &(s.pa)); printf("%s %d %f", s.a, s.p, s.pa); fclose(pf); pf = NULL; return 0; }
5.9 sprintf和sscanf函数
5.9.1 sprintf()
【函数部分说明】:
功能:
从字符串中读取格式化数据(将字符数组中的字符串按照格式说明符转换为对应的格式化数据)
5.9.2 sscanf
【函数部分说明】:
功能:
将格式化数据写入字符串(格式化数据转换为字符串存放在字符数组中)
基于以上两个函数使用场景:
int main() { //将格式化的数据转换为字符串存放在p数组中 struct S s = { "zhangsan",100,4.3 }; char p[1000] = { 0 }; sprintf(p, "%s %d %f", s.a, s.p, s.pa); printf("%s\n", p); //从p这个字符串中提取格式化的数据(用p数组中的数据,为结构体t成员赋值) struct S t; sscanf(p, "%s %d %f", t.a, &(t.p), &(t.pa)); printf("%s %d %lf", s.a, s.p, s.pa); return 0; }
小总结
六、二进制的方式读写函数
6.1 fwrite()
在这里插入图片描述
【函数部分说明】:
功能:
- 二进制输出,将 count 元素数组(每个元素的大小为 size bytes)从 ptr 指向的内存块写入流中的当前位置
返回值:
- 成功将返回写入元素个数
- 如果此数字与 count 参数不同,则写入错误会阻止函数完成
- 如果 size 或 count 为零,则函数返回零,错误指示器保持不变。
int main() { FILE* pf = fopen("test1.txt", "wb");//打开一个二级制文件 if (pf == NULL) { perror("fopen fail!!!"); return; } int nums[] = { 1,2,3,4,5,6,7 }; fwrite(nums, sizeof(int), 7, pf); fclose(pf); pf = NULL; return 0; }
【注意】:这里是通过二进制的形式写入文本文件中,如果想要看懂输入的数据,可以在打开方式选择二进制编辑器或者使用fread函数读取出来
6.2 fread()
【函数部分说明】:
- 功能:
- 二进制输入,从流中读取 count 元素的数组,每个元素的大小为 bytes,并将它们存储在 ptr 指定的内存块中。
返回值:
- 成功将返回写入实际元素个数
- 如果此数字与 count 参数不同,则表示读取时发生读取错误或达到文件末尾。
- 如果 size 或 count 为零,则该函数返回零, ptr 指向的流状态和内容保持不变
比如:如果实际文件中只有7个字符,count是14,那么读到7给字符就结束(返回值 < count就返回)
int main() { FILE* pf = fopen("test1.txt", "rb");//打开一个二级制文件 if (pf == NULL) { perror("fopen fail!!!"); return; } //int nums[] = { 1,2,3,4,5,6,7 }; //fwrite(nums, sizeof(int), 7, pf); //读取二进制存放的信息 int nums[10] = { 0 }; fread(nums, sizeof(int), 10, pf); for (int i = 0; i < 10; i++) { printf("%d ", nums[i]); } fclose(pf); pf = NULL; return 0; }
【C语言】探索文件读写函数的全貌(三)https://developer.aliyun.com/article/1617245