2

テキストファイルの行数を見つけてこれらの行を返す関数があります。配列のサイズを動的に変更する必要があります。ただし、印刷すると、バッファ内の各行の最後の数文字しか表示されません。私はCが初めてです。これはコードの主要部分です:

char * foo( char **buffer,  FILE * infile )

...

int buffSizer = 10;
*buffer = calloc( buffSizer, 1);
do { 
  char * result = fgets(*buffer, buffSizer, infile); 
  if (result == NULL){ 
    free(*buffer); 
    return(NULL); 
  } 
  char * ptr = strchr(*buffer, '\n'); 
  if (ptr){ 
    return(*buffer); 
  } 
  buffSiz = buffSizer * 2;
  *buffer = realloc(*buffer, buffSizer); 
} while (1);
4

1 に答える 1

1

再割り当てが必要になるたびに、すぐに戻って、これまでに読んだすべてのものを上書きします。*bufferすでに読んだ文字のオフセットを考慮する必要があります。

たとえば、次のように追加できます。

int offset = 0;

buffSiz宣言とともに、次のように使用します。

char * result = fgets(*buffer + offset, buffSiz - offset, infile); 

そして、再割り当てするときに、次を追加します。

offset = buffSiz - 1; // -1 to account for null character stored by fgets()

この行の前:

buffSiz = buffSiz * 2;

余談ですが、 に*buffer渡すと同時に再代入するのは危険ですrealloc。エラーが発生すると、元の割り当てがリークされ、データは回復できなくなります。この例はより安全です:

char *tmp = realloc(*buffer, buffSiz);
if (!tmp)
{
    free(*buffer);
    return NULL;
}
*buffer = tmp;
于 2013-02-01T00:13:50.727 に答える