我正在尝试创建一个程序,从文本文件中读入并解决不完整的9x9数独板。其中一块板可能看起来像这样:
N
145369287
629785431
783412569
567148392
938527 14
214936758
851 74623
492853 76
376291845
我需要打印出读入的电路板,我只是使用getline并打印字符串,然后将每个数字存储到一个数组中,空白可以转换为零以进行评估。如果我试图以直接的方式读取板,那么它将尝试将行的所有数字读作一个int,直到达到空格或换行符,并且如果我尝试使用get()通过char读取char ,我用newlines再次遇到问题,然后我必须将字符数组转换为一个用于评估的int数组,我想我也会遇到问题。这是我的代码到目前为止,我认为使用istringstream会很方便,但后来意识到我必须有更多的for循环,所以没有它的解决方案将是理想的。不允许使用矢量或花哨的模块或结构类似的东西,它是一个类赋值。
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <fstream>
using namespace std;
int main() {
ifstream infile("sudoku_infile.txt");
ofstream outfile("sudoku_outfile.txt");
int board[9][9];
char n;
char c;
string str;
stringstream into;
while (infile >> n){
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++){
getline(infile, str);
cout << str << "\n";
into << str;
}
return 0;
}
编辑: 好吧,我自己设计了一个解决方案,尝试将字符转换为int并将它们放在一个数组中,但它似乎不起作用:
while (infile >> str){
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++){
getline(infile, str);
cout << str << "\n";
for (int z = 0; z < 9; z++){
if (isdigit(str[z])){
d = str[z] - '0';
}
else{
d = 0;
}
board[i][j] = d;
}
}
for (int m = 0; m < 9; m++){
for (int f = 0; f < 9; f++)
cout << board[m][f];
cout << endl;
}
}
我得到这个作为输出:
145369287
629785431
783412569
567148392
938527 14
214936758
851 74623
492853 76
376291845
071924836
555555555
555555555
555555555
555555555
555555555
555555555
555555555
555555555
答案 0 :(得分:2)
你必须确保你的文件最多包含9 * 9个字符 - 否则它会以这种方式运行 - 但是很容易在那里添加边界检查。因为'0'在索引48的ASCII中开始,我正在计算char值减去幻数48。 但是你仍然需要自己添加一个''检查(否则它会被-16初始化),但我相信你可以做到!
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
int main(int argc, char **argv) {
std::ifstream infile("sudoku_infile.txt");
std::ofstream outfile("sudoku_outfile.txt");
int board[9][9];
size_t index = 0;
std::string str;
while (std::getline(infile, str)){
//std::cout << str << "\n";
for (size_t i = 0; i < str.size(); i++, index++){
board[index%9][index/9] = str[i] - '0';
}
}
return 0;
}
答案 1 :(得分:0)
可以使用standard algorithm函数之一轻松完成此操作,即std::copy
。您可以将其与iterator helpers和std::istream_inserter
{/ 3}} std::back_inserter
一起使用。
使用上述函数将整数放入std::vector
。
完成基础知识后,学会使用standard library对您有所帮助。
例如,即使您不能将它用于此分配,上述功能也可以像这样使用:
std::vector<std::string> vs;
std::copy(std::istream_iterator<std::string>(infile),
std::istream_iterator<std::string>(),
std::back_inserter(vs));
完成上述操作后,向量vs
将包含infile
流中所有以空格分隔的字符串。
然后把它放到一块板子里,你可以这样:
std::array<std::array<int, 9>, 9> board;
int i = 0;
for (const std::string& s : vs)
{
int j = 0;
for (const char& c : s)
board[i][j++] = c - '0';
++i;
}