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

