4.4文本输入函数
fgets适用于所有输入流
从文件中读取字符串并拷贝到字符数组中
第一个参数,接收拷贝的字符的指向字符数组的指针 第二个参数,需要读取字符的个数 第三个参数,是指向输入流的FILE对象的指针
实例如下
int main() { //打开文件 FILE* pf = fopen("test.txt", "r"); //判断文件是否成功打开 if (pf == NULL) { printf("%s\n", strerror(errno)); return; } //读文件 char arr[20] = { 0 }; fgets(arr, 5, pf); printf("%s\n", arr); //关闭文件 fclose(pf); pf = NULL; return 0; }
这里只拷贝四个字符,'\0’是字符数组后不可或缺的字符。
4.5格式化输出函数
fprintf 适用于所有输出流
将格式化数据打印到标准输出,也就是打印到文件中
先比较一下fprintf和printf
比较之后会发现,只是相差了一个是指向输出流的FILE对象的指针
实例如下
struct M { char name[20]; int age; double weight; }; int main() { struct M m = { "crush",20,55.5 }; FILE* pf = fopen("test.txt", "w"); if (pf == NULL) { printf("%s\n", strerror(errno)); return; } fprintf(pf, "%s %d %lf", m.name, m.age, m.weight); fclose(pf); pf = NULL; return 0; }
4.6格式化输入函数
fscanf适用于所有输入流
从输入流中读取格式化数据
先比较一下fscanf和scanf
相比之后发现,相差了一个指向输入流的FILE对象的指针
实例如下
struct M { char name[20]; int age; double weight; }; int main() { struct M m = {0}; FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return; } fscanf(pf, "%s %d %lf", m.name, &(m.age), &(m.weight)); printf("%s %d %lf", m.name, m.age, m.weight); fclose(pf); pf = NULL; return 0; }
4.7二进制输出
fwrite 只适用于文件
将数据转换成二进制写入输出流中
第一个参数,指向要写入的元素数组的指针 第二个参数,要写入元素的大小 第三个参数,要写入几个元素 第四个参数,指向输出流的FILE对象的指针
实例如下
struct M { char name[20]; int age; double weight; }; int main() { struct M m = { "crush",20,55.5 }; FILE* pf = fopen("test.txt", "wb"); if (pf == NULL) { printf("%s\n", strerror(errno)); return; } fwrite(&m,sizeof(struct M),1,pf); fclose(pf); pf = NULL; return 0; }
由于是二进制写入,所以有些数据写入之后就会看不懂
4.8二进制输入
fread 只适用于文件
从输入流中读取二进制数据
返回值size_t为实际读取到的个数
第一个参数,指向一个大小至少为(size*count)字节的内存块的指针 第二个参数,要读取的每个元素的大小 第三个参数,要读取元素的个数 第四个参数,指向输入流的FILE对象的指针
实例如下
struct M { char name[20]; int age; double weight; }; int main() { struct M m = { 0 }; FILE* pf = fopen("test.txt", "rb"); if (pf == NULL) { printf("%s\n", strerror(errno)); return; } fread(&m,sizeof(struct M),1,pf); printf("%s %d %lf", m.name, m.age, m.weight); fclose(pf); pf = NULL; return 0; }
4.9比较一组函数
scanf/fscanf/sscanf printf/fprintf/sprintf
sprintf
sscanf
实例如下
struct M { char name[20]; int age; double weight; }; int main() { struct M m = { "crush",20,55.5 }; struct M n = { 0 }; char arr[100]; //把s中的格式化数据转化成字符串放到arr中 sprintf(arr, "%s %d %lf", m.name, m.age, m.weight); printf("%s\n", arr); //从字符串arr中获取一个格式化的数据到n中 sscanf(arr, "%s %d %lf", n.name, &(n.age), &(n.weight)); return 0; }