1

プログラムで多次元配列を使用するのに問題があります。基本的に、このプログラムは scanf を使用して、リダイレクトされたファイルからユーザー ID と文字列を読み取ります。ファイル形式は、3 桁のユーザー ID、スペース、および各行のテストでの多肢選択問題の答えを表す文字列です。

111 dabac
102 dcbdc
251 dbbac

私が直面している問題は、ユーザーの数がわからないことと、ファイル データを複数回読み取ることができないことです。使ってみました

for (lineNumber = 0; lineNumber != -1; lineNumber++)
{
int result = scanf("%d ", &data);
if (result == EOF)
  break;
for(i = 0; i < numProblems; i++)
{
  scanf("%c", &input);
}

ファイル内の行数を取得してから、配列のサイズを設定します。配列は、同じ for ループを使用して、データを読み取る別の関数に渡されますが、

input = arrayName[numProblems][lineNumber];

2 番目の for ループ。私が直面している問題は、scanf がファイルからデータを 1 回しか読み取ることができず、初期化するまでデータを配列に格納できないことです。これには、何人のユーザーがいるかを知る必要があります。

私が設定した方法では、プログラムは行数(ユーザー)を見つけるか、データを配列に格納できます(サイズを任意の数に設定した場合)が、両方はできません。

ファイル名が一定ではないため(また、これはクラス用です...教授はscanfを使用する必要があるため)、scanfを使用する必要があり、ファイル内の行数を取得する方法がわかりません。まだデータを読み取ることができます。scanfを使用せずに行数を見つけるか、データを2回読み取る回避策を誰かが知っている場合は、助けていただければ幸いです。プログラム全体を投稿するのに役立つ場合は、それも可能です。

ありがとうございました、

エリック

4

3 に答える 3

0

入力が実際のファイルである限り (端末やその他のデバイスではありません)、 を使用rewind(stdin);して FILE ポインターをファイルの先頭に戻すことができます...

于 2013-03-27T22:05:49.637 に答える
0

これを行うには複数の方法があります。構造体を使用して、これまでに読み取られたものの数を数えることをお勧めします。

本当に配列を使い続けたい場合は、最初に malloc を使用して配列を割り当て、次に realloc を使用して配列を再割り当てします。再割り当てのための配列のサイズの現在のカウントがあります。

次のようになります。

POINTER *array = realloc(orig_array_pt, size);
if (array  == NULL)
{
    // realloc failed
}
else
{
    orig_array_pt = array;
}
于 2013-03-27T22:02:52.133 に答える
0

幸いなことに、scanf() は 1 回のパスで行全体を複数の変数に解析します。もっと似たものを試してください

scanf( "%d %s", &uid, answers );

stdin からデータを正常に解析できた回数をカウントし、その lineNumber カウントを呼び出すだけです (合計行数を知る必要がある場合)。

于 2013-03-27T22:16:01.693 に答える