C++读取文件时判断换行符的if语句失效、3D数组i索引不更新如何解决
问题根源
- 第一,
>>流提取运算符默认会跳过所有空白字符(包含换行符\n、空格、制表符等),你永远读不到换行符到temp变量里,所以if (temp == '\n')判断永远不会触发,i自然不会更新。 - 第二,代码逻辑顺序错误:你先判断旧的
temp值,再读取新的temp,还没做任何判断就直接把新读的temp存入数组,第一次循环时temp还是未初始化的野值,逻辑完全错位。 - 第三,
while(fin.eof() != 1)作为循环条件是错误用法,eof()标记只有在读完最后一个有效字符之后再次尝试读取才会触发,会导致循环多执行一次,存入无效值。
解决方案
步骤1:替换读取方式
把fin >> temp换成fin.get(temp),这个方法会逐个读取所有字符,不会跳过换行、空格等空白字符,才能正常识别换行符。
步骤2:调整逻辑顺序
先读取字符,再做分隔符判断,非分隔符的有效字符再存入数组。
修正后参考代码
// 初始化i,j,k的初始值为0,提前读第一个字符 char temp; int i = 0, j = 0, k = 0; fin.get(temp); while(!fin.eof()) { if(temp == '\n') { k = 0; j = 0; i++; cout << "call from 2nd if"; } else if(temp == ',') { k = 0; j++; cout << "call from 1st if"; } else { // 非分隔符才存入数组 data[i][j][k] = temp; cout << "address " << i << j << k << " : " << data[i][j][k] << endl; k++; } // 读下一个字符 fin.get(temp); }
额外注意
如果你的数据里的数字是多位数,不是单个字符存储,那你需要调整读取逻辑,改用按行读取getline拆分每行内容,再按逗号拆分字段,再转成对应数值类型,避免单个字符读取把多位数拆成单个字符。
内容的提问来源于stack exchange,提问作者daud nasir
相关产品推荐
相关产品推荐

