0

我的代码打印出一个 .txt 文件的版本,该文件显示一个 20x20 的字符表和空格。我怎样才能让数组像在 .txt 中一样正确显示。我不能使用向量或全局变量。没有这些也可以做到。文本中的前两行是 20 和 20,用于获取数组的维度。

ifstream inputFile;
int boardSizeRow;
int boardSizeCol;
inputFile.open("fileboard1.txt");
inputFile >> boardSizeRow;
inputFile >> boardSizeCol;
inputFile.get();

char gameBoard[20][20];
for (int row = 0; row < boardSizeRow; row++)
{
    for (int col = 0; col < boardSizeCol; col++)
    {
        gameBoard[row][col] = inputFile.get();
    }
}

for (int row = 0; row < boardSizeRow; row++) //////////////TO TEST PRINT
{
    for (int col = 0; col < boardSizeCol; col++)
    {
        cout << gameBoard[row][col];
    }
    inputFile.get();
    cout << endl;
}
return 0;


20

20

WWWWWWWWWWWWWWWWWWWW
  W GO  W          W
W WW      w    S   W      
W   W   GW  w      W  
WPW  WW          G W    
 WK       W        W     
W W W  W    w   w  W  
W WK W             W    
W   SW  U    w  w  W
                   W
    w          G   W
  G         w    w W 
D   wwwww          W
             w  D  W
w w   W w   w      W
    ww  w     w w  W
  G        w       W
    ww  w S    w   W
   WWW      G      W
WWWWWWWWWWWWWWWWWWWW
4

3 回答 3

3

这就是答案:) 好的几个编辑:输入:

   3
   3
   2 2 3
   2 2 3
   2 2 3

编码:

#include <fstream>
#include <iostream>

int main(){
using namespace std;
ifstream inputFile;
int boardSizeRow;
int boardSizeCol;
inputFile.open("fileboard1.txt");
inputFile >> boardSizeRow;
inputFile >> boardSizeCol;

char *gameBoard= new char[boardSizeRow*boardSizeCol];
for (int row = 0; row < boardSizeRow; row++)
{
    for (int col = 0; col < boardSizeCol; col++)
    {   
        inputFile >> *(gameBoard + boardSizeCol * row + col);
    }   
}

for (int row = 0; row < boardSizeRow; row++) //////////////TO TEST PRINT
{
    for (int col = 0; col < boardSizeCol; col++)
    {   
        cout << *(gameBoard + boardSizeCol * row + col) << " ";
    }   
    cout << endl;
}
delete []gameBoard
return 0;

}

于 2013-04-10T16:48:27.090 回答
2

如何使用 new 在 C++ 中声明二维数组?

做就是了:

inputFile >> boardSizeRow;
inputFile >> boardSizeCol;

char **gameBoardRow = new char*[boardSizeCol];
for(int i = 0; i < sizeY; ++i) {
    ary[i] = new char[boardSizeRow];
}

for (int row = 0; row < boardSizeRow; row++)
{
    for (int col = 0; col < boardSizeCol; col++)
    {   
        inputFile >> gameBoard[row][col];
     }   
}

for (int row = 0; row < boardSizeRow; row++) //////////////TO TEST PRINT
{
    for (int col = 0; col < boardSizeCol; col++)
    {   
        cout << gameBoard[row][col] << " ";
    }   
    cout << endl; 
}

for(int i = 0; i < boardSizeCol; ++i) {
    delete [] gameBoard[boardSizeRow];
}
delete [] gameBoard;
于 2013-04-10T17:07:08.120 回答
0

该文件包含行之间的换行符,您无需处理。因此,在阅读完第一行之后,将换行符的一个(或两个在 Windows 平台上)字符作为第二行中的第一个字符读取。

我建议你使用std::vector. std::string每行一个字符串。

就像是:

inputFile >> boardSizeRows;
inputFile >> boardSizeCols;

// Skip newline after the number of columns
inputFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

// And the empty line after that
inputFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

// Declare our game board
std::vector<std::string> gameBoard;

// Read the board
std::string line;
for (int row = 0; row < boardSizeRows && std::getline(inputFile, line); row++)
    gameBoard.push_back(line);

// And finally print the board
for (const std::string& l : gameBoard)
    std::cout << l << '\n';

读取文件时 for 循环中的条件是首先检查我们在文件中读取的内容不超过请求的内容,并且读取操作是否成功。


如果您的编译器无法处理C++11 基于范围的 for 循环(用于打印板),则必须使用迭代器以“老式”方式进行:

std::vector<std::string>::const_iterator li;
for (li = gameBoard.begin(); li != gameBoard.end(); li++)
    std::cout << *li << '\n';
于 2013-04-10T17:01:58.040 回答