C++使用FILE*和fprintf写入文件未达预期问题求助
问题根因
你的代码有两个核心错误直接导致写入失败,还有几个隐患会触发崩溃:
- 构造函数内的局部变量遮蔽了类成员指针
构造函数中写的FILE* fp = fopen(file_name, "w");会在构造函数的局部作用域声明一个和类私有成员fp完全同名的局部变量,fopen返回的有效文件指针只会存入这个临时局部变量,构造函数执行完就被丢弃了。类自身的私有成员fp始终是未初始化的野指针,后续fprintf、fclose操作的都是这个野指针,属于未定义行为,根本不会往正确的文件流里写内容。 - 未执行文件关闭操作,缓冲区内容未刷入磁盘
就算修复了指针问题,你的主函数里从未调用close()方法,C标准库的文件IO带有缓冲区,没有主动执行fclose或者fflush的情况下,缓冲区里的内容不会保证写入磁盘,很容易出现文件创建成功但内容为空的情况。 - 其他隐患
- 没有校验
fopen的返回值:如果路径无权限、文件名非法,fopen会返回NULL,直接操作空指针会触发程序崩溃。 - 头文件引用不规范:操作
FILE*、fopen、fprintf等C标准IO函数应该主动引入<cstdio>头,不要依赖<iostream>的间接引入,不同编译器下可能出现编译失败。 - 没有利用C++的RAII特性自动释放资源:手动调用
close很容易遗漏,应该把关闭逻辑放到析构函数里,对象生命周期结束时自动执行。
- 没有校验
修正后代码
头文件 include.h
#ifndef INCLUDE_H #define INCLUDE_H #include <cstdio> class write_file { public: write_file(const char *file_name) { fp = fopen(file_name, "w"); if (fp == nullptr) { perror("Failed to open file"); } } void write_line(const char *line) { if (fp == nullptr) return; fprintf(fp, "%s\n", line); } void close() { if (fp != nullptr) { fclose(fp); fp = nullptr; } } ~write_file() { close(); } private: FILE* fp; }; #endif
主文件 main.cpp
#include <iostream> #include "../include/include.h" using namespace std; int main() { write_file wf("test.txt"); wf.write_line("Hello, world!"); return 0; }
修正后重新编译运行,就会在程序运行目录生成带正确内容的test.txt文件。
内容的提问来源于stack exchange,提问作者Ralph Turner
相关产品推荐
相关产品推荐

