当我保存playingboard
数组时,save
会正确地打印它,但是当我尝试导入用import
创建的save
文件时,我得到了奇怪的输出--空格被删除,并被没有明显逻辑的1
s替换。 (示例如下)
最小可复制示例:
#include <iostream>
#include <fstream>
class Board
{
public:
char playingBoard[9][9];
Board()
{
for (unsigned char i = 0; i < 9; ++i)
for (unsigned char j = 0; j < 9; ++j)
playingBoard[i][j] = ' ';
}
bool import(std::string filename)
{
std::ifstream ifs {filename};
if (!ifs.is_open())
return false;
for (unsigned char i = 0; i < 9; ++i) {
for (unsigned char j = 0; j < 9; ++j) {
ifs >> playingBoard[i][j];
std::cout << playingBoard[i][j] << "|";
}
std::cout << std::endl;
}
ifs.close();
return true;
}
bool save(std::string filename) const
{
std::ofstream ofs {filename, std::ios::app};
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] << "|";
}
std::cout << std::endl;
}
ofs.close();
return true;
}
};
int main()
{
Board board;
board.import("filename");
std::cout << std::endl;
board.playingBoard[1][1] = '1';
board.save("filename");
}
>
第一次运行时的输出(文件以前不存在,因此只有一个输出):
| | | | | | | | |
|1| | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
第二次运行时的输出:
1| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
1| | | | | | | | |
|1| | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
第三次运行时的输出:
1|1|1| | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
1|1|1| | | | | | |
|1| | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
您的问题是,默认情况下,使用operator>>
会跳过空格。 您需要使用另一种方法从文件中提取字符,例如get
成员函数(下面的示例,用GCC-9.3.0测试)。
bool import(std::string filename)
{
std::ifstream ifs {filename};
if (!ifs.is_open())
return false;
for (unsigned char i = 0; i < 9; ++i) {
for (unsigned char j = 0; j < 9; ++j) {
playingBoard[i][j] = ifs.get();
std::cout << playingBoard[i][j] << "|";
}
std::cout << std::endl;
}
输出:
$ ./a.out
| | | | | | | | |
|1| | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
|1| | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |