You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++读取文件诡异Bug:空格被替换为1的异常问题

棋盘保存读取异常:空格被替换为1的问题分析与解决

先看你遇到的情况:保存棋盘时打印输出正常,但读取文件时空格莫名其妙变成了1,复现的代码和运行输出也很清楚,咱们来拆解问题根源:

问题根源

1. 保存时用了追加模式,导致文件内容不断累积

你的save函数里用了std::ios::app打开文件,这意味着每次运行程序,都会把新的棋盘内容追加到文件末尾,而不是覆盖原有内容。比如:

  • 第一次运行:文件不存在,import失败,然后save写入9行棋盘(只有[1][1]是1,其他是空格)
  • 第二次运行:import会读取文件里已有的9行内容,然后save又追加9行,文件里就有18行内容了
  • 第三次运行:import读取前9行时,会读到之前多次保存的混合内容,导致错误的字符被填充到棋盘里

2. 读取时用了>>运算符,自动跳过空白字符

ifs >> playingBoard[i][j]这个操作,输入流会自动跳过所有空白字符(空格、换行、制表符等)。当文件里有空格时,>>会直接跳过它,去读下一个非空白字符——比如之前保存的1,就会被填充到原本应该是空格的位置,这就造成了“空格被替换成1”的假象。

解决方案

针对这两个问题,咱们修改两处代码就行:

1. 把保存模式改成覆盖模式

把save函数里的文件打开方式从std::ios::app改成默认的覆盖模式,这样每次保存都会清空原有文件,写入新的棋盘内容:

bool save(std::string filename) const {
    // 去掉std::ios::app,默认打开方式就是覆盖
    std::ofstream ofs {filename};
    if (!ofs.is_open()) return false;
    for (unsigned char i = 0; i < 9; ++i) {
        for (unsigned char j = 0; j < 9; ++j) {
            ofs << playingBoard[i][j];
            std::cout << playingBoard[i][j] << "|";
        }
        // 写入换行符,让文件每行对应棋盘一行,方便后续读取
        ofs << std::endl;
        std::cout << std::endl;
    }
    ofs.close();
    return true;
}

2. 读取时用get()读取所有字符(包括空格)

把import里的>>换成ifs.get(),这样就能读取包括空格在内的所有字符,同时要处理每行末尾的换行符,避免把换行符读到棋盘里:

bool import(std::string filename) {
    std::ifstream ifs {filename};
    if (!ifs.is_open()) return false;
    char temp; // 用来跳过换行符
    for (unsigned char i = 0; i < 9; ++i) {
        for (unsigned char j = 0; j < 9; ++j) {
            // get()会读取每个字符,包括空格
            ifs.get(playingBoard[i][j]);
            std::cout << playingBoard[i][j] << "|";
        }
        // 跳过每行末尾的换行符,避免干扰下一行读取
        ifs.get(temp);
        std::cout << std::endl;
    }
    ifs.close();
    return true;
}

修改后的效果

这样修改后,每次运行程序:

  • save会覆盖文件,写入9行棋盘内容(每行9个字符+换行)
  • import会准确读取每个字符,包括空格,不会跳过空白内容,棋盘的状态就能正确还原,再也不会出现空格被替换成1的异常了。

内容的提问来源于stack exchange,提问作者beardeadclown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:32:53