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

C++实现vector文件I/O时输出异常数值的问题排查

问题根因
  • 读取接口使用错误:fin.get()的作用是逐字节读取文件内容,返回值为单个字符对应的ASCII编码,并非写入文件的整型数值。写入阶段通过<<将int类型转为文本字符串存储(存入1、2、3时,文件内实际存储内容为字符'1'、空格、'2'、空格、'3'、空格),用get()读取时拿到的是字符对应的ASCII码(例如'1'对应49、空格对应32),输出结果自然是无意义的异常值。
  • 读取逻辑存在冗余调用:while循环内连续调用两次fin.get(),第一次读取的内容直接打印未存入vector,第二次才执行push操作,本身读取逻辑错误还丢失了半数内容。
  • 循环判断逻辑存在缺陷:!fin.eof()的判断方式会在文件内容读取完成后多执行一次无效读取——eof()标志位只有在读操作触发文件末尾后才会置位,该判断逻辑会导致容器额外推入一个无效值。
修复方案

读取逻辑和写入逻辑保持匹配,使用流提取运算符>>直接读取int类型值,该运算符会自动跳过空格、换行等空白分隔符,直接解析出文本对应的整型数值,同时修正循环判断条件,规避eof判断的多读问题。
修正后完整可运行代码:

#include <vector>
#include <iostream>
#include <fstream>
using namespace std;

void saveOrder(vector<int> ex)
{
    ofstream fout("ex.txt");
    if (!fout.is_open()) {
        cerr << "fail" << endl;
        return;
    }
    for (vector<int>::iterator it = ex.begin(); it != ex.end(); it++) {
        fout << *it << " ";
    }
    fout.close();
}

vector<int> loadOrder()
{
    vector<int> ex2;
    ifstream fin("ex.txt");
    if (!fin.is_open()) {
        cerr << "fail" << endl;
        return ex2;
    }
    int tmp;
    // 读取成功才进入循环,自动跳过空白符,避免无效读取
    while (fin >> tmp) {
        ex2.push_back(tmp);
    }
    fin.close();
    return ex2;
}

int main() {
    vector<int> ex;

    ex.push_back(1);
    ex.push_back(2);
    ex.push_back(3);
    saveOrder(ex);

    vector<int> ex3;
    ex3 = loadOrder();

    for (vector<int>::iterator it = ex3.begin(); it != ex3.end(); it++) {
        cout << *it << endl;
    }
    return 0;
}

运行后会正常输出1、2、3三个值,和写入内容完全一致。

补充说明:如果需要用二进制方式读写文件,写入时要调用fout.write()按字节写入int的内存内容,读取时对应调用fin.read(),不能混用文本流写、字节流读的逻辑,否则一定会出现解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:06:20