c语言:文件处理操作-2
https://developer.aliyun.com/article/1515724
7、文件操作函数操作于屏幕的方法
细心的人应该会发现,上面所列的文件操作函数的表格中对应位所有输出输入流,那么有人应该会去思考,这些文件操作函数是否可以作用于普通的键盘输入屏幕输出操作。
继续甚于研究,其实对于任何一个c程序,只要运行起来,就会默认打开三个流:
stdin -- 标准输入流 -- 键盘
stdout -- 标准输出流 -- 屏幕
stderr -- 标准错误流 -- 屏幕
它们三个均为FIEL*类型,也就是一个文件指针,那么我们就可以利用上面的函数对齐进行操作
那么该如何操作? 看下面的代码:
#include<stdio.h> #include<stdlib.h> int main() { int car = fgetc(stdin); fputc(car, stdout); system("pause"); return 0; }
其结果如图。输入5,输出5
相对的,对字符串的操作:
#include<stdio.h> #include<stdlib.h> int main() { char arr[20] = { 0 }; fgets(arr,8,stdin); fputs(arr, stdout); system("pause"); return 0; }
结果为:
8、二进制读写
1、fwrite
解释:
- ptr指向要写入的元素的地址,
- size_t size 为每一个要写入元素的大小(单位:字节)
- size_t count 元素数
- 如果成功写入则返回总元素数
- 如果这个返回值于元素总数的参数不同,则表示写入错误。
- 如果每个元素大小,或者总元素个数为0,则返回0.
我们写入一个上面写过的结构体到ilike.txt文件当中去
#include<stdio.h> #include<stdlib.h> struct S { char name[20]; int age; }; int main() { S a = { "xiaoxin",18 }; FILE* pf = fopen("ilike.txt", "w"); if (pf == NULL) printf("pf fopen \"ilike\" fail"); else { fwrite(&a, sizeof(struct S), 1, pf); fclose(pf); pf = NULL; } system("pause"); return 0; }
打开文件如图:
因为是二进制的形式,所以用二进制读fread来读取。
2、fread
- 从文件流中读取数据块
- 从流中读取元素,每个元素大小为size个字节,一共读取count个元素
- 读取到的元素将会被存储到ptr指向的内存当中
- 如果读取成功,则返回读取到的元素的总数
- 如果这个返回值和要读取的元素总数count不同,说明在读取玩到count个元素之前就发生了读取错误或者提前遇到了文件末尾
- 如果size或count为0,则返回值也为0
我们继续读取上次以二进制写入的xiaoxin 18,
#include<stdio.h> #include<stdlib.h> struct S { char name[20]; int age; }; int main() { //S a = { "xiaoxin",18 }; S tem = { 0 }; FILE* pf = fopen("ilike.txt", "r"); if (pf == NULL) printf("pf fopen \"ilike\" fail"); else { //fwrite(&a, sizeof(a), 1, pf); fread(&tem, sizeof(tem), 1, pf); fclose(pf); pf = NULL; } printf("%s %d", tem.name, tem.age); system("pause"); return 0; }
结果为:
五、随机读写
也称为选择读写。如果存在一串数据“a-z”的26个小写字母,如果我不想读取字母abc三个字母,那么就要用到位置指示器(position indicator),也就是文件指针。
1、fseek
fseek,顾名思义也就是,file seek 的意思,文件搜索:
- stream为需要操作的文件流
- offset,偏移量,从原点偏移的字节数
- origin,起始位置,也就是文件指针当前所指向的位置
- 如果读取成功,函数返回0
- 否则,返回一个非0值
这个
origin对应的有三个constant值 分别为: SEEK_SET SEEK_CUR SEEK_END
对应 文件头 文件中间 文件尾(EOF所在位置)
举例,我们在ilike.txt文件中写入abcdef,使用feek读取:
预测: fseek ( pf, 3 , SEEK_SET) 读取为 d
fseek ( pf, -4 , SEEK_END) 读取为 c
#include<stdio.h> #include<stdlib.h> int main() { FILE* pf = fopen("ilike.txt", "r"); if (pf == NULL) { printf("pf fopen fail"); } fseek(pf, 3, SEEK_SET); int ch = fgetc(pf); printf("%c", ch); fseek(pf, -4, SEEK_END); ch = fgetc(pf); printf("%c", ch); fclose(pf); pf = NULL; system("pause"); return 0; }
结果为:
2、ftell
有时候对文件多次操作后,不知道文件指针指向了什么位置,这个时候就可以用ftell函数来解决
返回类型为偏移量。我们在上面的fseek代码的情况下加上ftell:
#include<stdio.h> #include<stdlib.h> int main() { FILE* pf = fopen("ilike.txt", "r"); if (pf == NULL) { printf("pf fopen fail"); } fseek(pf, 3, SEEK_SET); int ch = fgetc(pf); printf("%c ", ch); fseek(pf, -4, SEEK_END); ch = fgetc(pf); printf("%c\n", ch); int pos = ftell(pf); printf("%d", pos); fclose(pf); pf = NULL; system("pause"); return 0; }
最后结果为 :3
我们可以看出来c对于起始位置的偏移量确实为3,因为c在读完之后,文件指针会向后偏移一位。
3、rewind
对于不知道文件指针最后指向什么地方,也可以使用rewind将文件指针回调到最初位置。
本次内容完......