2

私は現在、ログ解析スクリプトを bash から C に書き直しています。バッファーと呼ばれる配列を 1024 に制限するのではなく、動的に拡張するように設定する方法についてアドバイスが得られるかどうか疑問に思っていました。malloc を使用すると思います。しかし、この特定のアプリケーションに適切に実装する方法がよくわかりません。助けていただければ幸いです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _GNU_SOURCE
void main(int argc, char *argv[], char *envp[])
{
  FILE *fd;
  char *name;
  name = getenv("MCEXEC_PLAYERNAME");
  char *filename;
  filename = malloc(sizeof "/home/minecraft/freedonia/playerdata/deathlog-.txt" - 1 +    strlen(name) + 1);
  if (!filename) exit(EXIT_FAILURE);
  sprintf(filename,"/home/minecraft/freedonia/playerdata/deathlog-%s.txt",name);
  char buff[1024];
  if ((fd = fopen(filename, "r")) != NULL)
  {
    fseek(fd, 0, SEEK_SET);

    while(!feof(fd))
    {
      memset(buff, 0x00, 1024);
      fscanf(fd, "%[^\n]\n", buff);
    }
    printf("%s\n", buff);
  }
  else
  printf( "fail" );
}
4

2 に答える 2

2

配列を動的に割り当てるには、mallocを使用します。

必要に応じて、再割り当てしてサイズを変更します。

編集:

それ以外の:char buff[1024];

使用する:

char *buff;
buff = malloc(1024); //This will allocate 1024 chars

次のような別の変数を使用char tmp[256];して、ファイルから読み取り、に保存できますbuff。に入れるtmpときbuffは、 の文字のサイズに注意してくださいbuff。必要に応じて、realloc を呼び出します。

len = sizeof(buff);
buff = realloc(buff, len+256); //This will increase the buff size by 256
于 2012-05-09T19:04:49.770 に答える
1

あなたのコードから、開いているファイルの最後の行のみを印刷しようとしているようです。ファイルの最後までシークし、最後から 2 番目の '\n' を逆方向に検索し、その時点から一度に最大 1024 バイトをバッファに読み込み、画面に出力することができます。この場合、バフの再割り当ては必要ありません。

EDIT : 毎回 1023 まで読み取り、buff[1023] = '\0' を常に設定します。

于 2012-05-09T19:09:07.723 に答える