0

タブや空白で区切られたテキスト ファイルを 2 次元配列に読み込もうとしています。ファイルは次のようになります。

1 -3 4
4 -3 7
8 -1 10

次のようなことを行うことが許可されていることを示唆するコードにアクセスできます。

int nums[][] = {
    #include "matrix.txt"
};

ただし、このコードをコンパイルしようとすると、エラーが発生します。

$ gcc hangserver.c 
hangserver.c:10:5: error: array type has incomplete element type
In file included from hangserver.c:11:0:
matrix.txt:1:5: error: expected ‘}’ before numeric constant
$ 

このファイルを配列にロードするエレガントではない方法があることは知っていますが、純粋な好奇心から、上記の方法論を実装できるかどうかを知りたいです。私の質問に答えるために時間を割いていただき、ありがとうございます。

4

3 に答える 3

2

あなたのアプローチには概念的な問題があります。

たとえば、あなたが持っていた場合

1, 2, 3, 4, 5, 6,

コンパイラは、3x2 または 2x3 または 1x6 または 6x1 の配列が必要であることをどのように知る必要がありますか?

そのため、事前に列数を知る必要があります。

上記の例では、これは

int matrix [][3] = {
#  include "data.txt"
};

これも同様です:

int matrix [][2] = {
#  include "data.txt"
};

この:

int matrix [][1] = {
#  include "data.txt"
};

この:

int matrix [][6] = {
#  include "data.txt"
};

中括弧の欠落に関するコンパイラの警告が表示されますが、(最初のケースの場合) 上記のように、実際には次のようになります。data.txt

{1, 2, 3,},{4, 5, 6,},

(末尾,の s はオプションです。)


外部からのファイルを介してこれを完全に操作するには、次のようにします。

int matrix[][
#  include "colums.txt"
] = {
#  include "data.txt"
};

ここでの内容は、データが分割される予定columns.txtの列数を表す整数になります。data.txt

于 2013-10-27T15:21:31.800 に答える
1

行は次のように展開されます。

int nums[][] = {
    1 -3 4
    4 -3 7
    8 -1 10
     };

これは受け入れられない C および C++ 構文です。matrix.txt ファイルを次のように変更してみてください。

{1, -3, 4},
{4, -3, 7},
{8, -1, 10}
于 2013-10-27T15:12:15.933 に答える