C语言文件操作
AKA.瞳源治 人气:01.操作的准备
c语言中的文件操作相关函数的头文件都是在#include<stdio.h>里
除此之外还得定义一个文件指针对目标文件进行指向操作,一般形式为:FILE *指针变量名;
例如:FILE *fp
2.文件的打开
对于数据的处理一般有两种存放形式:文本文件和二进制文件
想要操作文件,那肯定先得把它打开,而在C语言中一般使用fopen函数打开文件
一般形式为:fopen(文件名,文件操作形式);
该函数成功实现将返回一个文件指针,失败则返回NULL
例如:
FILE* pf = fopen("test.txt", "w");
一般为了保证文件正常打开,会进行以下测试:
if (pf == NULL) { perror("fopen"); return 1; }
3.文件的使用方式
使用文件的方式如下:
“r”(只读):为输入打开一个文本文件 对文件进行读操作
“w”(只写):为输出打开一个文本文件 对文件进行写操作
“a”(追加): 向文本文件尾添加数据
“rb”(只读): 为输入打开有一个二进制文件
“wb”(只写):为输出打开一个二进制文件对文件进行写操作
“ab”(追加): 向二进制文件尾添加数据
“r+”(读写): 为读写打开一个文本文件
“w+”(读写):为读写建立一个新的文本文件
“a+”(读写): 向文本文件尾添加数据
“rb+”(读写): 为读写打开一个二进制文件
“wb+”(读写):为读写建立一个新的二进制文件
“ab+”(读写): 为读写打开一个进制文件
4.相关的函数
4.1 fputc
从输入流缓冲区中取出下一个字符并将字符放入文本文件中
int fputc ( int character, FILE * stream );
样例:
#include<stdio.h> int main() { FILE* pf = fopen("test.txt.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } //写文件 char ch = 'a'; for (ch = 'a'; ch <= 'z'; ch++) { fputc(ch, pf); } fclose(pf); pf = NULL; return 0; }
运行结果:
4.2 fgetc
向文本文件中写出一个单个字符
int fgetc ( FILE * stream );
样例:(文本文件与fputc调用相同)
#include<stdio.h> int main() { FILE* pf = fopen("test.txt.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } //读文件 int ch = 0; while ((ch = fgetc(pf)) != EOF) { printf("%c ", ch); } fclose(pf); pf = NULL; return 0; }
运行结果:
4.3 fputs
从输入流缓冲区中取出下一个字符串并将字符放入文本文件中
int fputs ( const char * str, FILE * stream );
样例:
int main() { char arr[256] = { 0 }; FILE* pf = fopen("test.txt.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } //写文件 fputs("ssssssssssssssssss\n", pf); fputs("llllllllllllllllll\n", pf); fclose(pf); pf = NULL; return 0; }
运行结果:
4.4 fgets
向文本文件中写出一个字符串
char * fgets ( char * str, int num, FILE * stream );
样例:(文本文件与fputs调用相同)
int main() { char arr[256] = { 0 }; FILE* pf = fopen("test.txt.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } fgets(arr, 255, pf); printf("%s", arr); fgets(arr, 255, pf); printf("%s", arr); fclose(pf); pf = NULL; return 0; }
运行结果:
4.5 fprintf
格式化输出到一个流文件中
int fprintf ( FILE * stream, const char * format, ... );
样例:
struct s { char name[20]; int age; double score; }; #include<stdio.h> int main() { struct s s = { "雾都",20,98.5 }; FILE* pf = fopen("test.txt.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } //写文件 fprintf(pf, "%s %d %lf", s.name, s.age, s.score); fclose(pf); pf = NULL; return 0; }
运行结果:
4.6 fscanf
用于读取数据
int fscanf ( FILE * stream, const char * format, ... );
样例:(文本文件与fprintf调用相同)
struct s { char name[20]; int age; double score; }; #include<stdio.h> int main() { struct s s = { 0 }; FILE* pf = fopen("test.txt.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } fscanf(pf, "%s %d %lf", s.name, &(s.age), &(s.score)); printf("%s %d %lf", s.name, s.age, s.score); /*fprintf(stdout, "%s %d %lf", s.name, s.age, s.score);*/ fclose(pf); pf = NULL; return 0; }
运行结果:
4.7 fwrite
将 count 个大小为 length 的对象从名为 buffer 的数组二进制写入输入流文件名。
size_t fwrite(void *buffer, size_t length, size_t count, FILE *filename);
样例:
#include<stdio.h> struct s { char name[20]; int age; double score; }; int main() { struct s s = { "雾都",20,98.5 }; FILE* pf = fopen("test.txt.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } //二进制的写 fwrite(&s, sizeof(struct s), 2, pf); fclose(pf); return 0; }
运行结果:(因为是转成二进制了,倒也正常)
4.8 fread
二进制读取count
大小对象的数量length
从输入流filename
到名为的数组buffer
size_t fread(void *buffer, size_t length, size_t count, FILE *filename);
样例:(二进制文件与fwrite调用相同)
struct s { char name[20]; int age; double score; }; int main() { struct s s = { "雾都",20,98.5 }; FILE* pf = fopen("test.txt.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } //二进制的读 fread(&s, sizeof(struct s), 2, pf); printf("%s %d %lf", s.name, s.age, s.score); fclose(pf); return 0; }
运行结果:
加载全部内容