如何读取包含空格的整数字符数组?

时间:2013-11-29 08:40:36

标签: c++ arrays string

我正在尝试创建一个程序,从文本文件中读入并解决不完整的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

2 个答案:

答案 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 helpersstd::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;
}