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

使用fstream写入0-10到TXT后读取求和失败,求排查错误

问题分析与修复

你的代码主要有三个核心问题,导致求和结果异常:


1. 写入的数字无分隔符

直接将0到10依次输出到文件后,文件内容会变成012345678910——所有数字连在一起,没有空格、换行这类分隔标记。读取时getline会把整串内容当成一行,stoi(line)会将长串转成整数12345678910,完全不符合单个数字求和的需求。

2. 读写切换时的指针与状态错误

  • 写完数据后你用了seekp(0, ios::beg),这是设置写指针的位置,但读取操作应该用seekg(0, ios::beg)来定位读指针(虽然部分编译器允许混用,但标准操作需区分开)。
  • 写入到文件末尾后,流的eofbit会被置位,必须用myFile.clear()重置状态,否则后续读取会直接失败。

3. 读取逻辑混乱

你同时混用getline和>>读取数据:getline读走整行后,myFile >> number会从行尾之后的位置读取,此时已无有效数据,属于多余且干扰逻辑的操作。


修复后的代码

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    fstream myFile;
    // 加ios::trunc确保文件存在时清空,不存在则创建
    myFile.open("numbers.txt", ios::in | ios::out | ios::trunc);

    int sum = 0;
    int number = 0;

    if (myFile.is_open()) {
        // 写入时用空格分隔数字
        for (int i = 0; i <= 10; i++) {
            myFile << i << " ";
        }

        // 重置流状态 + 定位读指针到文件开头
        myFile.clear();
        myFile.seekg(0, ios::beg);

        // 用>>自动读取单个整数,跳过空格分隔符
        while (myFile >> number) {
            sum += number;
        }
    }

    cout << "Sum: " << sum << endl;
    return 0;
}

额外说明

  • ios::trunc参数:确保每次运行时清空旧文件内容,避免历史数据影响结果。
  • 用空格分隔数字后,>>操作符可以自动识别并读取每个整数,无需手动拆分字符串。
  • 读写切换前必须调用clear(),否则流会处于EOF状态,无法执行读取操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:42:28