C++ ifstream读取txt文件输出重复、数值异常问题求解
C++文件读取重复、字段错位问题修复
核心问题点
- 多余内层循环:代码中每完成一次读取,就通过
for (count = 1; count <= 10; count++)循环打印10次同一条记录,直接造成单条数据重复输出10遍。 - 循环判断时机错误:使用
while(data)在读取操作前判断流状态,当文件读取到末尾(EOF)时,流不会立刻失效,会额外进入一次循环执行无效读取。此时n读取失败被赋值为0,其余字符串变量仍保留第一次读取的缓存值,就出现了n=0的重复错误输出。 - 流分隔符残留+分隔符不匹配:
- 用
data >> n读取整数后,n后方的制表符/空格会残留在输入流中,导致后续第一个getline直接读取到空内容,所有字段读取错位,缺失后续字段值。 - 每行最后一个字段
type后方是换行符而非制表符,原代码用'\t'作为最后一个getline的分隔符,会跨读取行内容,进一步造成数据错乱。
- 用
- 冗余全局变量:全局定义的
count、size变量既无实际作用,还存在和标准库命名冲突的风险。
修复后可运行代码
#include <iostream> #include <fstream> #include <string> using namespace std; int main () { ifstream data; data.open("cards2.txt"); int n; string name, ID, stamina, plusmode, type; // 将读取操作直接放入循环判断条件,读取成功才进入循环体 while (data >> n) { // 跳过读取n后残留在流中的空白字符(制表符、空格) data.ignore(); // 最后一个字段以换行符为分隔符,匹配文件实际存储格式 getline(data, name, '\t'); getline(data, ID, '\t'); getline(data, stamina, '\t'); getline(data, plusmode, '\t'); getline(data, type, '\n'); // 移除多余的10次打印循环,读一行输出一行 cout << n << " " << name << " " << ID << " " << stamina << " " << plusmode << " " << type << endl; } data.close(); return 0; }
编码注意事项
- 用流提取运算符
>>读取数值类数据后,如果后续要使用getline按分隔符读取字符串,必须先调用ignore()清除流中残留的分隔符,避免读取错位。 - 文件读取循环不要提前判断流状态,要将读取操作本身作为循环判断条件,避免EOF后多执行一次无效逻辑。
- 非必要不要定义全局变量,变量尽量在使用位置就近定义,减少命名冲突和脏数据缓存问题。
内容的提问来源于stack exchange,提问作者user17108831
相关产品推荐
相关产品推荐

