-1

重複の可能性:
テキスト ファイルを c の配列に読み込む

テキスト ファイルを 1 行ずつ配列の行に読み込むのに苦労しています。malloc または関連コマンドの使用は許可されていません。私が見つけた最新のコードはこれで、動作しません:

void readfile(const char *filename) {
FILE *f;
f = fopen(filename, "r");
int linecount;
char inputError;
char a[500];
char array[50];
//struct cal_event one[200];

linecount = 0;
while(inputError != EOF) {
    inputError = fscanf(f, "%s\n", array);
    linecount++;
}
fclose(f);
char names[linecount][500];

f = fopen(filename, "r");
int i;
for(i = 1; i < linecount; i++)
    fscanf(f, "%s", names[i]);
    printf("%s ", names[i]);
fclose(f);
}

コード例が必要です。本当にありがとう!

4

1 に答える 1

1
while(inputError != EOF) {
    inputError = fscanf(f, "%s\n", array);
    linecount++;
}

あなたの「宛先」ポインタfscanfは、すべてのループ反復で同じです。これは、反復ごとにデータが同じ場所に書き込まれ、前の内容が上書きされることを意味します。バッファーの内容の最後を追跡し、バッファーの最後へのポインターを「宛先」ポインターとして使用する必要があります。

バッファーの内容の最後を追跡するということは、別の非常に重要なことができることを意味します: 配列がオーバーフローしないようにすることです。配列は 50 文字にハードコーディングされているため、(合計で) 50 文字を超えないように配列を読み取る必要があります。そうしないと、メモリが破損し、あらゆる種類の悪いことが起こる可能性があります。

タイトルに基づいて、各配列要素が文字列(テキスト行を表す)になるように、ファイルを配列に読み込みたいようです。文字列自体が配列であるため、arrayオブジェクトを配列の配列にする必要があります。これを 2 次元配列と呼ぶこともできます。例えば:

char array[50][100];

これにより、50 行のテキストを保持できる配列が作成され、各行の長さは最大 100 文字です。array[0]次に、最初の行をに、次の行をarray[1]などに読み込みます。

于 2012-10-08T21:31:00.730 に答える