C++处理8列文本文件忽略前6列输出时生成空白文件问题求解
C++读取文本文件忽略前6列仅保留最后2列问题修复
核心问题排查
- 命名空间缺失:标准库的
ofstream、cout、endl都属于std命名空间,代码中没有加std::前缀也没有导入命名空间,会直接编译失败,若运行的是之前编译的错误版本就会生成空白文件。 - 循环前多执行了一次读取操作:进入while循环前你已经读取了第一行的8个值,但没有存入vector,第一行数据直接丢失;如果输入文件只有1行数据,vector就会是空的,最终输出空白文件。
- 缺少输出文件打开成功判断:无法排查路径权限、输出路径不存在等写入异常问题。
修正后代码
先缓存再写入版本
#include <iostream> #include <fstream> #include <vector> #include <utility> void allNuclei() { std::ifstream in("Zr/Zr_0.txt"); if (!in.is_open()) { std::cout << "输入文件打开失败" << std::endl; return; } int p1, p2, p3, p4, p5, p6, A, N; std::vector<std::pair<int, int>> vec; // 移除了循环外多余的读取操作,直接在循环条件中完成读取判断 while(in >> p1 >> p2 >> p3 >> p4 >> p5 >> p6 >> A >> N){ vec.push_back(std::make_pair(A, N)); } in.close(); std::ofstream m("All_Zr.txt"); if (!m.is_open()) { std::cout << "输出文件打开失败" << std::endl; return; } std::cout << "starting fill" << std::endl; for(size_t i = 0; i < vec.size(); i++){ m << vec[i].first << " " << vec[i].second << std::endl; } m.close(); }
边读边写优化版本(大文件适用,无需额外缓存)
#include <iostream> #include <fstream> void allNuclei() { std::ifstream in("Zr/Zr_0.txt"); if (!in.is_open()) { std::cout << "输入文件打开失败" << std::endl; return; } std::ofstream m("All_Zr.txt"); if (!m.is_open()) { std::cout << "输出文件打开失败" << std::endl; return; } int p1, p2, p3, p4, p5, p6, A, N; while(in >> p1 >> p2 >> p3 >> p4 >> p5 >> p6 >> A >> N){ m << A << " " << N << std::endl; } in.close(); m.close(); std::cout << "处理完成" << std::endl; }
内容的提问来源于stack exchange,提问作者Zachary Finger
相关产品推荐
相关产品推荐

