自定义MYString类文件读取至vector时内容重复问题求助
解决MYString类读取文件时单词重复的问题
首先先把你提供的头文件片段整理出来:
// .h /*类描述:一个字符串类,包含各类成员函数,可将字符串传入类对象,支持文件读写操作。*/ #ifndef MYString12_H #define MYString12_H #include <fstream> using namespace std; class MYString1...
从你描述的问题来看,程序能读取文件但单词重复,这种情况基本和头文件的声明无关,大概率是读取逻辑的实现代码出了问题。我给你梳理几个最可能的诱因和对应的排查/解决办法:
1. 读取前没清空容器,导致重复追加
如果你每次调用读取文件的成员函数时,没有先清空存储单词的vector,那么新读取的内容会直接追加到容器已有内容的后面,看起来就像是单词重复了。比如你第一次读取了["apple", "banana"],第二次没清空就又读一次,容器就变成["apple", "banana", "apple", "banana"]。
- 解决:在读取函数的开头,先执行
your_vector.clear();,确保每次读取都是从空容器开始。
2. 读取循环里不小心重复添加了单词
这是最常见的低级错误——比如在while循环内部,同一个单词被多次push_back到vector里。举个例子:
string temp_word; ifstream file("test.txt"); while (file >> temp_word) { // 错误示例:不小心写了两次push_back my_string_vector.push_back(MYString1(temp_word)); my_string_vector.push_back(MYString1(temp_word)); }
或者你的循环条件判断有问题,导致同一单词被多次读取。
- 解决:先在循环里加个调试输出,比如
cout << "当前读取到:" << temp_word << endl;,看看控制台输出的单词是不是本身就重复(排除文件本身的问题),然后检查循环内的代码,确保每个单词只被添加一次。
3. MYString的拷贝/赋值逻辑有问题
如果你的MYString类内部有动态分配的内存(比如自己管理char*指针),但没有正确实现拷贝构造函数和赋值操作符重载,那么当你把MYString对象存入vector时,可能会出现对象被错误复制的情况,表现为单词重复。
- 解决:检查这两个函数的实现,确保做了深拷贝。如果你的MYString只是封装了标准库的
string,那默认的浅拷贝没问题,但还是要确认有没有其他逻辑导致对象复制异常。
4. 文件流的状态或指针没重置
如果你复用了同一个ifstream对象多次读取文件,但每次读取前没有重置流状态和文件指针,就可能导致重复读取文件的某一部分内容。比如第一次读完文件后,文件指针在末尾,第二次读取时如果没重置,可能会重复读取最后一个单词(或者直接读失败,但某些情况下会出现异常重复)。
- 解决:每次打开文件读取前,执行以下操作:
file.clear(); // 清除流的错误状态 file.seekg(0, ios::beg); // 将文件指针移到文件开头
如果按照上面的方法排查后还是没解决,建议你把读取文件的成员函数的实现代码贴出来,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者user2852927
相关产品推荐
相关产品推荐

