为什么我的程序在执行后没有输出信息

时间:2012-05-11 00:15:06

标签: c file-io

我目前正在使用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);
    }

1 个答案:

答案 0 :(得分:1)

如果您想坚持使用现有代码,请再次检查此行

memset(buff,0x00,1024);

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

OR

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

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;
} 

希望这会有所帮助。