You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:03:29