0

Vimで編集したテキストファイルを配列に読み込もうとしています。

テキストファイルは30*50で、1桁の数字で構成されています。私はそれを機能させるために夢中になっていますが、改行文字が原因で問題が発生していると思います。これが私が使ってきたものです:

Map::Map(char* filename)
{
grid[30][50] = (0);
string line;
ifstream m_file(filename);
if (m_file.is_open())
        {
                while(m_file.good())
                 {
                        for (int i = 0; i < 30; i++)
                        {
                        getline(m_file,line);
                                 for (int k = 0; k < 50; k++)
                                {
                                int tnum = atoi(line.c_str());
                                grid[i][k] = tnum;
                                }
                        }
                }
                m_file.close();
        }
};

gridは、ヘッダーファイルでint grid[30][50]として定義されています。

印刷に使用するコードは次のとおりです。

void display_room(int trid[30][50])
{
        for (int i = 0; i < 30; i++)
        {
                for (int k = 0; k < 50; k++)
                {
                        mvprintw(i,k,"%d",trid[i][k]);
                };
        };
};

Mapを呼び出した後sMap=Map( "testmap");

私は単に1桁の数字を配列にキャプチャし、その配列を(cursesを使用して)再印刷しようとしています。現在、テストマップファイルを読み取り、テストマップファイルに何が含まれているかに関係なく、すべてゼロを出力します。

4

3 に答える 3

1

私があなたの問題を理解している場合:あなたの構文解析は、数字だけが存在するはずの行全体から値を設定します...

int tnum = atoi(line.c_str());
grid[i][k] = tnum;

数字の変換(ASCIIからint / byte / ...は、次の方法で実行できます。

grid[i][k] = line[k] - '0';

(おそらく、いくつかのキャストが必要です。)

于 2011-08-27T19:08:52.357 に答える
0

内側のループではatoi、毎回行の全内容で呼び出しています。行は50文字の長さでatoiあるため、に変換できませんint(anで表現できる最大値intは2147483647であり、数値はおそらくそれよりも大きくなります)。atoi失敗すると、を返します0

必要なのは、行の各文字をに変換することですint。そんな感じ:

for (int i = 0; i < 30; i++)
{
    getline(m_file,line);
    for (int k = 0; k < 50; k++)
    {
        // The ASCII character of the digits 0 to 9 have
        // successives values.
        int tnum = line[k] - '0';
        grid[i][k] = tnum;
    }
}
于 2011-08-27T19:09:50.233 に答える
0

コードをもう一度見てください。あなたが言っていることを望むのではなく、実際に言っていることを見てみてください

int tnum = atoi(line.c_str());

その行に、その行の50個の数字のそれぞれを順番に読み取らせたいことは明らかです。しかし、それはそれを言いません。行全体を整数に変換しようとします(そしてそれを50回実行しようとします)。

あなたの数字は一桁なので、実際にはもっと簡単なものが必要です

int tnum = line[k] - '0';

line [k]と言うと、ループを回るたびに異なる数字が得られます(kはループを回るたびに増加するため)。この- '0'ビットは、文字を整数に変換するための単なるトリックです。それがどのように機能するかを理解できるかどうかを確認してください。

于 2011-08-27T19:16:58.970 に答える