2013-04-10 21 views
0

我的代码打印出一个.txt文件的一个蹩脚版本,该文件显示一个20x20的字符和空格表。我怎样才能让数组正确显示,就像它在.txt中一样。我不能使用矢量或全局变量。没有这些就可以完成。文本中的前两行是20和20以获取数组的维数。来自.txt文件的C++二维数组

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 
+2

你能显示你正在阅读的文件吗?它包含您获得的角色之间的空格吗?它是否包含换行符? – 2013-04-10 16:31:23

+1

另外,为什么在第二个循环中('cout << endl;')上方的'inputFile.get();'?这是一个复制粘贴错误? – 2013-04-10 16:32:25

+0

@JoachimPileborg文件被添加 – 2013-04-10 16:40:42

回答

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; 

}

+0

不,它不是,不是完全无论如何。 C++没有可变长度的数组,所以'gameBoard'的声明是无效的。另外,你不能正确地得到换行符。 – 2013-04-10 16:55:00

+0

char gameBoard [boardSizeRow] [boardSizeRow];确保你必须使用常数值,而不是变量 – 2013-04-10 16:55:35

+0

另一种方式是:'char * gameBoard = new char [0xfff];''和'inputFile >> *(gameBoard + boardSizeCol * row + col);''''cout << *(gameBoard + boardSizeCol * row + col)<<“”;'但是新行有什么问题?有用。 – 2013-04-10 17:04:49

0

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

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

喜欢的东西:

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 range-base for-loops(用于打印板),你有一个迭代器做了“老土”的方式:

std::vector<std::string>::const_iterator li; 
for (li = gameBoard.begin(); li != gameBoard.end(); li++) 
    std::cout << *li << '\n'; 
2

How do I declare a 2d array in C++ using new?

只要做:

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;