Лично я бы начал с другого формата файла: введите значение для каждой ячейки. То есть каждая строка во входном файле будет представлять строку на доске судоко. Пустые поля будут использовать пробел. Непосредственным преимуществом является то, что вход на самом деле выглядит как доска судоко. Кроме того, вы должны ввести не более 90 символов: 9 символов для доски и новую строку для каждой строки:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
int main(int ac, char* av[])
{
std::ifstream in(ac == 1? "sudoko.init": av[1]);
char board[9][9];
for (int i(0); i != 9; ++i)
{
in.read(board[i], 9).ignore();
}
if (!in)
{
std::cout << "failed to read the initial board\n";
}
else
{
typedef std::ostream_iterator<char> iterator;
std::fill_n(iterator(std::cout << "board:\n\n+", "+"), 9, '=');
for (int i(0); i != 9; ++i)
{
std::copy(board[i] + 0, board[i] + 9, iterator(std::cout << "\n|", "|"));
std::fill_n(iterator(std::cout << "\n+", "+"), 9, (i + 1) % 3? '-': '=');
}
std::cout << "\n";
}
}
Это будет принимать следующие данные:
4 5 3 8
71 3
16 7
6 4 7
6 8
1 9 5
6 42
5 94
4 7 9 3
Обратите внимание, что каждая из этих строк использует 9 символов. Возможно, вы захотите использовать что-то более заметное, например .
.