6月1日 14:50
C语言文件操作怎么做?fopen/fread/fwrite 怎么用?
C 语言文件操作就四步:fopen 打开 → fread/fwrite(或 fgets/fprintf)读写 → fseek/ftell 定位 → fclose 关闭。核心原则是:打开必检查返回值,关闭前确保所有操作完成,错误用 ferror/feof 判断。
追问
文本模式和二进制模式有什么区别?
文本模式("r"/"w")在 Windows 上会自动做换行转换——读时把 \r\n 变成 \n,写时把 \n 变成 \r\n。二进制模式("rb"/"wb")原样读写,不做任何转换。Linux/macOS 上没区别,因为换行符本身就是 \n。跨平台代码处理二进制数据(图片、结构体)时一定要用二进制模式,否则数据会被悄悄改掉。
fread 和 fgets 怎么选?
fgets 按行读取文本,遇到 \n 或 EOF 停止,适合逐行处理配置文件、日志。fread 按字节块读取,一次读指定大小的块,适合二进制数据(结构体、数组)或大文件批量读取。性能上 fread 更快,因为它跳过了行尾检测和字符串格式化。
怎么获取文件大小?
最常见的方法:跳到末尾看位置,再跳回来:
cfseek(fp, 0, SEEK_END); long size = ftell(fp); rewind(fp);
注意这是对常规文件的做法,对管道、设备文件、标准输入不适用(fseek 可能失败)。更稳妥的方式是用 fstat(POSIX)。
文件操作怎么处理错误?
三个工具:ferror(fp) 检测读写错误,feof(fp) 检测是否到文件尾,perror() 把 errno 翻译成人话打印出来。常见模式:
cif (fread(buf, 1, size, fp) < size) { if (ferror(fp)) perror("Read error"); else if (feof(fp)) { /* 正常结束 */ } }
文件指针忘记关闭会怎样?
fclose 刷出缓冲区里还没写入磁盘的数据,然后释放 FILE 结构体。忘了关闭,最后一批数据可能丢失,文件描述符泄漏——进程打开文件数有上限(通常 1024),多了就 fopen 失败。长期运行的程序(服务器)里这个问题尤其严重。
写段代码
cFILE *fp = fopen("data.bin", "rb"); if (!fp) { perror("fopen"); return -1; } fseek(fp, 0, SEEK_END); long size = ftell(fp); rewind(fp); char *buf = malloc(size); fread(buf, 1, size, fp); fclose(fp);