使用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
相关产品推荐
相关产品推荐

