fputc
#include<stdio.h> int main() { FILE* pf = fopen("test.txt", "w"); //以读的方式打开文件 if (pf == NULL) { perror("fopen"); return 1; } //写文件 fputc('a', pf); fputc('b', pf); fputc('c', pf); fputc('d', pf); //关闭文件 fclose(pf); pf = NULL; return 0; }
经过我们的操作,也是成功一个一个字符的把abcd放入我们的test.txt文件当中
还要注意的是以”w“的方式写的话,会先销毁文件的内容
我们如果把fputc的内容注释掉看一下结果
#include<stdio.h> int main() { FILE* pf = fopen("test.txt", "w"); //以读的方式打开文件 if (pf == NULL) { perror("fopen"); return 1; } //写文件 /*fputc('a', pf); fputc('b', pf); fputc('c', pf); fputc('d', pf);*/ //关闭文件 fclose(pf); pf = NULL; return 0; }
看到我们文件的内容也没有了
从fpen中可以看出我们放入字符的顺序也是有序的
fgetc
int fgetc(FILE* stream)
#include<stdio.h> int main() { FILE* pf = fopen("test.txt", "r"); //以读的方式打开文件 if (pf == NULL) { perror("fopen"); return 1; } //读文件 int ch = fgetc(pf); printf("%c", ch); ch = fgetc(pf); printf("%c", ch); ch = fgetc(pf); printf("%c", ch); fclose(pf); pf = NULL; return 0; }
在我们读取到结尾的时候会返回一个EOF或者空指针
文本行输出函数fputs
int fputs( const char *string, FILE *stream );
他的作用和fputc一样,效果就是整行的输出
下面我们来看代码
#include<stdio.h> int main() { FILE* pf = fopen("test.txt", "w"); //以写的方式打开文件 if (pf == NULL) { perror("fopen"); return 1; } //写一行到文件 fputs("abcdef\n", pf); fputs("xxxxxx\n", pf); fclose(pf); pf = NULL; return 0; }
想写在一行的话不加\n就行了
文本行输入函数fgets
char* fgets(char*string,int n,FILE* steam)
从指定的stream中读取一行,并把它存在一个字符串中,返回这个字符串的地址,当读到最后一个字符或者遇到\n就停止读
#include<stdio.h> int main() { char arr[20]; FILE* pf = fopen("test.txt", "r"); //以读的方式打开文件 if (pf == NULL) { perror("fopen"); return 1; } //读一行到文件 fgets(arr, 6, pf); printf("%s", arr); fclose(pf); pf = NULL; return 0; }
这里大家可能有疑问,就是明明写着6,但是为什么我们读取的是5个字符,因为这个是一种保护机制,有时候我们的末尾是\0并不需要读,所以我们读到的字符是n-1个字符
格式化输出函数fprintf
int fprintf(FILE*stream,const char* format)
fprintf用于对格式化的数据进行写文件,发送格式化输出流中。
格式化的数据可以是结构体
#include<stdio.h> struct stu { char name[20]; int age; float score; }; int main() { struct stu s1 = { "zhangsan",18,99.9f }; FILE* pf = fopen("test.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } fprintf(pf, "%s %d %f", s1.name, s1.age, s1.score); fclose(pf); pf = NULL; return 0; }
fscanf
int fscanf(FILE* stream,const char*format,...)
fscanf 用于对格式化的数据进行读取,从stream读取格式化输入,适用于所有输入流
#include<stdio.h> struct stu { char name[20]; int age; float score; }; int main() { struct stu s1 = { "zhangsan",18,99.9f }; FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } fscanf(pf, "%s %d %f", s1.name, &s1.age, &s1.score); printf( "%s %d %f", s1.name, s1.age, s1.score); fclose(pf); pf = NULL; return 0; }
二进制输出函数fwrite
写一个数据到流中去,把buffer所指向的数据写到流当中去
#include<stdio.h> struct stu { char name[20]; int age; float score; }; int main() { struct stu s1 = { "zhangsan",18,99.9f }; FILE* pf = fopen("test.txt", "w+"); if (pf == NULL) { perror("fopen"); return 1; } fwrite(&s1, sizeof(struct stu), 1, pf); fclose(pf); pf = NULL; return 0; }
上面的内容就是二进制,就看不太懂了
那我们可以以二进制读的方式把内容重新读出来
fread
#include<stdio.h> struct stu { char name[20]; int age; float score; }; int main() { struct stu s1 = { "zhangsan",18,99.9f }; FILE* pf = fopen("test.txt", "r+"); if (pf == NULL) { perror("fopen"); return 1; } fread(&s1, sizeof(struct stu), 1, pf); printf("%s %d %f", s1.name, s1.age, s1.score); fclose(pf); pf = NULL; return 0; }
以上就是文件操作的一部分内容,我们分两章来写
----------------------------------
那今天的分享就到这里,谢谢大家