C++如何读取文件内容存入二维数组 运行出现垃圾值如何解决
问题原因
- 缺少文件打开成功校验:如果p4data1.dat、p4data2.dat不在程序运行的工作目录下,
open操作会失败,后续读取逻辑不会修改传入的数组,数组保留初始化前的垃圾值。 - 缺少读取成功校验:如果传入的rows与columns的乘积大于12(两个数据文件都只有12个有效字符),超出有效字符数的位置不会被赋值,同样会显示垃圾值。
- 隐藏问题:如果调用
fileAndRandom前没有初始化随机数种子,rand()每次运行都会返回固定值,无法实现随机选文件的效果。
修复后代码
// 需提前包含头文件:<fstream> <cstdlib> <ctime> void fileAndRandom(char letArr[][COLUMN], int rows, int columns) { // 调用该函数前请在main函数开头执行srand((unsigned int)time(NULL))初始化随机种子 int random = rand() % 2 + 1; ifstream readFile; // 统一初始化数组为默认值,避免部分位置未读到值残留垃圾 for(int i = 0; i < rows; i++) { for(int k = 0; k < columns; k++) { letArr[i][k] = '\0'; } } // 根据随机值打开对应文件 if(random == 1) { readFile.open("p4data1.dat"); } else { readFile.open("p4data2.dat"); } // 校验文件是否打开成功 if(!readFile.is_open()) { return; } // 读取内容,每次读取都校验是否读取成功 for(int i = 0; i < rows; i++) { for(int k = 0; k < columns; k++) { if(!(readFile >> letArr[i][k])) { // 读取失败提前退出,避免无效操作 break; } } } readFile.close(); }
注意事项
- 请确认传入的
rows * columns值等于12,和两个数据文件的有效字符总数匹配 - 请将p4data1.dat、p4data2.dat放在程序生成的可执行文件同目录下,避免文件打开失败
内容的提问来源于stack exchange,提问作者Cezlock
相关产品推荐
相关产品推荐

