C语言文件操作完全指南:从基础到实践 C语言文件操作完全指南1. 文件操作基础概念C语言将文件视为一个字符(字节)序列由一个个字符(字节)数据顺序组成。根据数据组织形式可分为ASCII文件以字符形式存储便于阅读和编辑二进制文件以二进制形式存储节省空间且处理效率高标准文件操作包括打开、关闭、读写、状态检查以及定位等。2. 文件打开与关闭2.1 文件打开函数FILE *fopen(char *pname, char *mode);功能说明按照mode规定方式打开pname指定的文件若文件不存在写模式(mode包含w)创建新文件读模式(mode包含r)返回错误参数说明pname要打开的文件名字符串mode文件处理方式字符串常见模式r只读w只写(创建新文件或清空已有)a追加r读写(文件必须存在)w读写(创建新文件或清空已有)a读写(追加模式)返回值成功返回文件指针失败返回NULL示例FILE *fp; if((fpfopen(test, r)) NULL) { printf(The file can not be opened.\n); exit(1); }2.2 标准设备文件C语言将输入输出设备视为文件标准输入(stdin)键盘标准输出(stdout)屏幕标准错误(stderr)错误输出程序启动时自动打开这三个文件。2.3 文件关闭函数int fclose(FILE *fp);功能说明关闭fp指向的文件释放文件结构体变量返回操作结果参数说明fp已打开文件的指针返回值成功0失败EOF示例int n fclose(fp);3. 文件读写操作3.1 字符读写3.1.1 读取字符int fgetc(FILE *fp);示例显示文件内容#include stdio.h void main(int argc, char *argv[]) { int ch; FILE *fp; if(argc ! 2) { printf(Error format,Usage: display filename1\n); return; } if((fpfopen(argv[1], r)) NULL) { printf(The file %s can not be opened.\n, argv[1]); return; } ch fgetc(fp); while(ch ! EOF) { putchar(ch); ch fgetc(fp); } fclose(fp); }3.1.2 写入字符int fputc(int ch, FILE *fp);示例文件复制#include stdio.h void main(int argc, char *argv[]) { int ch; FILE *in, *out; if(argc ! 3) { printf(Error in format,Usage: copyfile filename1 filename2\n); return; } if((infopen(argv[1], r)) NULL) { printf(The file %s can not be opened.\n, argv[1]); return; } if((outfopen(argv[2], w)) NULL) { printf(The file %s can not be opened.\n, argv[2]); return; } ch fgetc(in); while(ch ! EOF) { fputc(ch, out); ch fgetc(in); } fclose(in); fclose(out); }3.2 字符串读写3.2.1 读取字符串char *fgets(char *str, int n, FILE *fp);3.2.2 写入字符串int fputs(char *str, FILE *fp);示例文件内容附加#include stdio.h #define SIZE 512 void main(int argc, char *argv[]) { char buffer[SIZE]; FILE *fp1, *fp2; if(argc ! 3) { printf(Usage: linkfile filename1 filename2\n); return; } if((fp1fopen(argv[1], a)) NULL) { printf(The file %s can not be opened.\n, argv[1]); return; } if((fp2fopen(argv[2], r)) NULL) { printf(The file %s can not be opened.\n, argv[2]); return; } while(fgets(buffer, SIZE, fp1) ! NULL) printf(%s\n, buffer); while(fgets(buffer, SIZE, fp2) ! NULL) fputs(buffer, fp1); fclose(fp1); fclose(fp2); }3.3 格式化读写3.3.1 格式化写入int fprintf(FILE *fp, char *format, arg_list);3.3.2 格式化读取int fscanf(FILE *fp, char *format, arg_list);示例学生信息存储#include stdio.h void main() { char name[10]; int nAge, nClass; long number; FILE *fp; if((fpfopen(student.txt, w)) NULL) { printf(The file %s can not be opened.\n, student.txt); return; } fscanf(stdin, %s %d %d %ld, name, nClass, nAge, number); fprintf(fp, %s %5d %4d %8ld, name, nClass, nAge, number); fclose(fp); if((fpfopen(student.txt, r)) NULL) { printf(The file %s can not be opened.\n, student.txt); return; } fscanf(fp, %s %d %d %ld, name, nClass, nAge, number); printf(name nClass nAge number\n); fprintf(stdout, %-10s%-8d%-6d%-8ld\n, name, nClass, nAge, number); fclose(fp); }3.4 二进制读写3.4.1 二进制读取int fread(void *buffer, unsigned size, unsigned count, FILE *fp);3.4.2 二进制写入int fwrite(void *buffer, unsigned size, unsigned count, FILE *fp);示例结构体文件操作#include stdio.h #define SIZE 4 struct worker { int number; char name[20]; int age; }; void main() { struct worker wk; int n; FILE *in, *out; if((infopen(file1.txt, rb)) NULL) { printf(The file %s can not be opened.\n, file1.txt); return; } if((outfopen(file2.txt, wb)) NULL) { printf(The file %s can not be opened.\n, file2.txt); return; } while(fread(wk, sizeof(struct worker), 1, in) 1) fwrite(wk, sizeof(struct worker), 1, out); fclose(in); fclose(out); }4. 文件状态检查4.1 文件结束检测int feof(FILE *fp);4.2 错误检测int ferror(FILE *fp);4.3 清除错误标志void clearerr(FILE *fp);4.4 获取当前位置long ftell(FILE *fp);示例带错误处理的文件复制#include stdio.h void main(int argc, char *argv[]) { FILE *in, *out; char ch; if(argc ! 3) { printf(Usage: copyfile filename1 filename2\n); return; } if((infopen(argv[1], rb)) NULL) { printf(The file %s can not be opened.\n, argv[1]); return; } if((outfopen(argv[2], wb)) NULL) { printf(The file %s can not be opened.\n, argv[2]); return; } while(!feof(in)) { ch fgetc(in); if(ferror(in)) { printf(read error!\n); clearerr(in); } else { fputc(ch, out); if(ferror(out)) { printf(write error!\n); clearerr(out); } } } fclose(in); fclose(out); }5. 文件定位5.1 重置文件指针void rewind(FILE *fp);5.2 随机定位int fseek(FILE *fp, long offset, int base);base参数取值SEEK_SET文件开头SEEK_CUR当前位置SEEK_END文件末尾示例随机访问学生记录#include stdio.h #include string.h struct std_type { int num; char name[20]; int age; char class; } stud; int cstufile() { int i; FILE *fp; if((fpfopen(stufile, wb)) NULL) { printf(The file cant be opened for write.\n); return 0; } for(i1; i100; i) { stud.num i; strcpy(stud.name, aaaa); stud.age 17; stud.class 8; fwrite(stud, sizeof(struct std_type), 1, fp); } fclose(fp); return 1; } void main() { int n; FILE *fp; if(cstufile() 0) return; if((fpfopen(stufile, rb)) NULL) { printf(The file can not be opened.\n); return; } for(n0; n100; n2) { fseek(fp, n*sizeof(struct std_type), SEEK_SET); fread(stud, sizeof(struct std_type), 1, fp); printf(%10d%20s%10d%4c\n, stud.num, stud.name, stud.age, stud.class); } fclose(fp); }