0

我目前正在用 C 语言编写一个日志解析程序,在几个人的推荐下,我决定用 fgets 和 scanf 的组合替换 fscanf,而不是像以前那样返回日志文件的最后一行,程序只会产生一个空白行然后退出,我对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" );
}

对于有效的版本,它几乎只是 while 循环中被注释掉的部分,以及 finbuff 不包含在程序中

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

1 回答 1

1

如果您只想坚持使用当前代码,请检查此行一次

memset(buff, 0x00, 1024);

我认为这里有一些问题,如果你可以将“buff”定义为静态分配而不是动态分配,那么试试(char buff[256] = {0})。

或者

如果你可以选择这个来获得最后一行:

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 回答