1

ファイルの行を取得して、文字列の配列の一意のインデックスに配置しようとしています。

char *fileString[newline_count];
        rewind(makeFile);
        int i;
        int i2 = 0;
        int i3 = 0;
        char temp[500];
        for(i = 0; i < string_size; i++){
            temp[i3] = fgetc(makeFile);
            if(temp[i3] == '\n'){
                temp[i3] = '\0';
                fileString[i2] = temp;
                i2++;
                i3 = 0;
            }else{
                i3++;
            }   
        }

        for(i = 0; i < newline_count; i++){
            printf("%s %c", fileString[i], '\n');
        }

最後の for ループは、文字列の配列である fileString の内容を出力するだけです。i は最初の for ループのインデックス、i2 は fileString のインデックス、i3 は行の内容が temp に格納されると fileString に格納される一時文字のインデックスです。fileString の内容が何度も最後の行になっているのはなぜだろうと思っています。最後の for ループは、ファイル内の行数に対してファイルの最後の行を出力するだけです。私は完全に道に迷っており、非常に疲れているので、ここで助けを求めています。大変ありがたく存じます。

4

3 に答える 3

1

個々の文字を読み取って文字列に入れる必要はありません。fgets() を使用します。各行にメモリを割り当て、データを取得し、その割り当てられたデータへのポインタをデータ構造に格納します。

例えば、

  // Allocate an array pointers, using 1000 as our initial size.
  int lineReferencesSize = 1000;
  char **lineReferences = (char **) malloc (sizeof(char *) * lineReferencesSize);
  char buf[100];

  int i = 0;
  while(fgets(buf, 100, fin)) {
    lineReferences[i] = strdup(buf);
    i++;
  }

完了したら、必ず free() を実行してください。

現在、lineReferences は、1000 char * ポインターを格納できる固定サイズのポインター配列です。深刻な目的のために、任意の固定サイズを持たないデータ構造を検討します。これを行うには、lineReferences を動的配列にし、制限に達したときにサイズを変更し、量を 2 倍にするために realloc() を実行して、先に進みます。考慮すべき興味深いエッジ ケースがいくつかあります (realloc のマニュアル ページを参照してください)。

または、次のように書くこともできます。

  // Allocate an array pointers, using 1000 as our initial size.
  char *lineReferences[1000];
  char buf[100];

  int i = 0;
  while(fgets(buf, 100, fin)) {
    lineReferences[i] = strdup(buf);
    i++;
  }

しかし、他のフォームで何が起こっているかを理解することは重要です。

于 2013-11-15T00:38:36.693 に答える
1

各反復で、バッファーtempは の各位置に割り当てられfileStringます。つまり、配列内のすべてのエントリは同じバッファ (最後に読み取られた最後の行を含む) を指します。

「簡単な」修正は、その行を次のように変更することです。

fileString[i2] = strdup(temp);

これを行う場合、リークを避けるために各エントリを解放する必要があります。

于 2013-11-14T23:55:00.977 に答える
1

;tempのすべてのインデックスに割り当てています。fileStringこれにより、 のすべての要素がfileString同じもの (temp配列の最初の要素) を指すようになります。の内容を新しい行ごとに上書きし続けるためtemp、ファイルの読み取りが完了すると、最後の行のみが含まれてしまいます。

tempそれらを保持するには、他の場所 (および一意)の内容をコピーfileStringし、一時temp配列ではなく、そのコピーを指す必要があります。たとえば、各行とその場所からのmalloc行を読み取った後の十分な長さの新しいメモリ(作業が完了したら、これを行う必要があります)。簡単な方法は、基本的にと を組み合わせたものと同じことを行うが、非標準関数である which を使用することです (したがって、練習のために、他に何もなくても、独自の を実装してください)。strcpytempfreestrdupmallocstrcpystrdup

于 2013-11-14T23:55:52.787 に答える