如何正确存储二维文本文件到二维数组?读取打印异常排查
问题排查与解决思路
嘿,这个问题我之前碰到过好多次,大概率是文件读取时的换行残留或者字符读取方式不对导致的,下面给你拆解几个最常见的原因和对应的修复方案:
1. 读取行列数后没处理换行符,导致后续读取错位
当你用inFile >> rows; inFile >> cols;读完行列数后,输入流的指针其实停在第二行的换行符上。如果这时候直接开始读迷宫字符,第一个读到的会是这个换行符,而不是迷宫的第一个#,后面的读取全都会错位,结果就是实际的迷宫内容根本没写到数组里,数组里还是你初始化的默认#。
解决办法很简单,读完行列数后手动跳过换行符:
#include <limits> // 需要包含这个头文件使用numeric_limits inFile >> rows; inFile >> cols; // 跳过当前行剩余的所有字符直到换行,避免残留的换行干扰后续读取 inFile.ignore(numeric_limits<streamsize>::max(), '\n');
2. 用>>读取字符时自动跳过了空格
>>运算符读取字符时会默认跳过所有空白字符(空格、换行、制表符这些),但你的迷宫里的空格是需要保留的有效内容啊!这就导致这些空格根本没被读到数组里,对应位置还是初始化的#,只有#、s、e这些非空白字符被读取,但位置也会因为跳过空格而错乱。
要读取包括空格在内的所有字符,得改用inFile.get():
void setArray(int rows, int cols, char maze[][MAX_COLS], ifstream& inFile) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { // get()会读取每个字符,包括空格 maze[i][j] = inFile.get(); } // 读完一行后跳过末尾的换行符(如果你的文件每行末尾有换行) inFile.ignore(); } }
3. 数组初始化逻辑搞反了
如果你的setArray函数里先把整个数组都填成#,然后再尝试从文件读取内容覆盖,但如果读取过程中因为某些原因(比如读取的字符数不够、文件格式不对)没覆盖全,那没被覆盖的位置就会留着初始的#,看起来整个迷宫都是#。
建议调整初始化逻辑,要么直接读取到数组里,要么只在读取失败时设默认值:
// 错误示例:先全填#,再覆盖(容易残留) void setArray(int rows, int cols, char maze[][MAX_COLS], ifstream& inFile) { // 不要先全设成#! for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { maze[i][j] = '#'; } } // 后续读取如果没覆盖全,就会有残留的# ... } // 正确示例:直接读取,读取失败时再设默认值 void setArray(int rows, int cols, char maze[][MAX_COLS], ifstream& inFile) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if (!inFile.get(maze[i][j])) { // 读取失败时才设#,或者抛出错误提示 maze[i][j] = '#'; } } // 跳过行末的换行符 inFile.ignore(); } }
最后也可以检查下你的文本文件格式:确保前两行是单独的行数和列数,第三行开始是连续的迷宫字符(包括空格),没有多余的空行或者分隔符哦。
内容的提问来源于stack exchange,提问作者Josh Garza
相关产品推荐
相关产品推荐

