0

私は現在Cでログ解析プログラムに取り組んでおり、数人の勧めで、fscanfをfgetsとscanfの組み合わせに置き換えることにしましたが、以前のようにログファイルの最後の行を返す代わりに、プログラムは空白行を生成し、その後終了します。私はCに比較的慣れていないので(数週間前に自分自身を教え始めました)、いくつかのばかげた間違いを見落としているかもしれませんが、誰かがこれを手伝ってくれるなら私は大いに感謝しますそれ、ありがとう!

#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;
  buff = malloc(1024);
  char *finbuff;
  finbuff = malloc(1024);
  if ((fd = fopen(filename, "r")) != NULL)
  {
    fseek(fd, 0, SEEK_SET);

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

動作したバージョンでは、プログラムに含まれていないfinbuffとともに、whileループのコメントアウトされた部分だけでした。

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

1 に答える 1

1

あなたが現在のコードだけに固執したいなら、plsはこの行を一度チェックします

memset(buff、0x00、1024);

ここに問題があると思います。uが「バフ」を動的ではなく静的割り当てとして定義できる場合は、それを試してください(char buff [256] = {0})。

また

uがこれを選択して最後の行を取得できる場合:

int main(){
const char *file = "in";
FILE *in = fopen(file, "r");
if (in != NULL){
int bytes = 0;
int nl = 0;
while(fseek(in, --bytes, SEEK_END) == 0){
if (fgetc(in) == '\n' && ++nl > 2){
break;
}
}
char line[ARG_MAX];
fgets(line, sizeof line, in);
fputs(line, stdout);
fclose(in);
}
return 0;
} 

これがお役に立てば幸いです。

于 2012-05-11T04:28:00.163 に答える