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

C++读写文件后内容未更新问题求助

文件读写不更新的问题解决

问题原因

你遇到的核心问题是:用std::ios::out | std::ios::in模式打开文件后,读取内容时文件指针会移动到读取结束的位置,直接写入新内容不会覆盖原有文件,而是在当前指针位置追加或部分覆盖,导致旧内容残留。此外,原代码缺少文件打开失败的判断,也无法排查路径或权限问题。

修正方案

方案一:重置指针并截断文件

读取内容后,将写指针移回文件开头,截断文件清除原有内容,再写入新值:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>

int main() {
    // 初始化随机数种子,保证每次运行x值不同
    std::srand(std::time(nullptr));
    
    long int moy;
    std::string line;
    std::fstream file;
    long int x = 35 + (std::rand() % (37 - 35 + 1));
    
    file.open("C:/Users/MSI/Desktop/omnetpp-6.0.1/samples/inet4/src/inet/applications/udpapp/B1.txt", std::ios::out | std::ios::in);
    if (!file.is_open()) {
        std::cerr << "无法打开目标文件" << std::endl;
        return 1;
    }
    
    std::getline(file, line);
    std::cout << line << std::endl;
    
    moy = (x + std::stoi(line)) / 2;
    
    // 将写指针移到文件开头,截断文件清除原有内容
    file.seekp(0);
    file.truncate();
    file << moy << std::endl;
    
    file.close();
    return 0;
}

方案二:分两次打开文件(读+写)

先以只读模式读取内容,关闭后再以写入模式打开覆盖原有内容:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>

int main() {
    std::srand(std::time(nullptr));
    
    long int moy;
    std::string line;
    long int x = 35 + (std::rand() % (37 - 35 + 1));
    
    // 只读模式读取文件内容
    std::ifstream inFile("C:/Users/MSI/Desktop/omnetpp-6.0.1/samples/inet4/src/inet/applications/udpapp/B1.txt");
    if (!inFile.is_open()) {
        std::cerr << "无法打开文件读取内容" << std::endl;
        return 1;
    }
    std::getline(inFile, line);
    inFile.close();
    
    std::cout << line << std::endl;
    moy = (x + std::stoi(line)) / 2;
    
    // 写入模式打开,直接覆盖原有内容
    std::ofstream outFile("C:/Users/MSI/Desktop/omnetpp-6.0.1/samples/inet4/src/inet/applications/udpapp/B1.txt");
    if (!outFile.is_open()) {
        std::cerr << "无法打开文件写入内容" << std::endl;
        return 1;
    }
    outFile << moy << std::endl;
    outFile.close();
    
    return 0;
}

额外说明

  • 必须添加std::srand(std::time(nullptr))初始化随机数种子,否则每次运行程序生成的x值可能重复。
  • 加入文件打开失败的判断,可以快速定位路径错误、文件权限不足等问题。

内容的提问来源于stack exchange,提问作者Omaima Younsi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:35:55