C++读取文件出现垃圾值原因排查 实现输出两文件共有整数功能
现有代码出现垃圾值的原因
- 固定数组越界:你定义的
arr、arr2都是长度为1的静态数组,读取文件时count不断累加,往超出数组长度的内存地址写入和读取数据,属于未定义行为,自然会出现垃圾值,严重时会直接崩溃。 - 文件流类型错误:你打开
file2.txt使用了ofstream(写文件流),如果要读取file2的内容需要使用ifstream,同时声明的text1、text2属于冗余变量,完全没有用到。 - 逻辑缺失:当前代码只尝试读取第一个文件,既没有读取第二个文件的逻辑,也没有求两个文件数值交集、输出到目标文件的逻辑。
完整功能实现
推荐使用std::unordered_set存储第一个文件的数值,利用其O(1)的查找效率快速判断第二个文件的数值是否为共有值,同时自动去重,不需要手动处理未知长度的数组。
实现代码如下:
#include <iostream> #include <fstream> #include <unordered_set> using namespace std; int main() { unordered_set<int> num_set; int temp; // 读取第一个文件的所有整数存入set ifstream file1("file1.txt"); if (!file1.is_open()) { cout << "file1.txt打开失败" << endl; system("pause"); return 1; } while (file1 >> temp) { num_set.insert(temp); } file1.close(); // 打开第二个文件和输出文件 ifstream file2("file2.txt"); ofstream output("output.txt"); if (!file2.is_open() || !output.is_open()) { cout << "文件打开失败" << endl; system("pause"); return 1; } // 读取第二个文件,匹配共有值写入输出文件 while (file2 >> temp) { if (num_set.count(temp)) { output << temp << " "; num_set.erase(temp); // 避免重复输出同一个共有值 } } file2.close(); output.close(); system("pause"); return 0; }
代码说明
- 用
unordered_set存储第一个文件的所有整数,自动去重,无需提前声明固定长度的容器,适配未知数量的输入。 - 读取第二个文件时,每读到一个整数就判断是否在set中,存在则写入output.txt,同时删除set中对应的数值,避免第二个文件出现重复共有值时多次输出,和示例输出格式匹配。
- 增加了文件打开失败的判断,避免文件不存在时程序无响应。
内容的提问来源于stack exchange,提问作者dipdopkop
相关产品推荐
相关产品推荐

