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

标签 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);
    }

最佳答案

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

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

希望这会有所帮助。

关于c - 为什么我的程序执行后没有输出信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10543816/

相关文章:

c - Termcap tgetstr 获取方向键

c - 使用fork()创建文件夹

python - 在Python中使用多处理读取文件时的同步

java - Android 中的 file.renameTo(file) 会出什么问题

java - 我可以使用什么文件格式直接从程序输出格式化的文本文件,而无需标记太复杂?

c - 在 cmake 文件的 execute_process 命令中使用 cmake 变量

c - 在 C 中使用 MPI_Reduce 进行多项操作

c - qemu-arm 运行已编译的二进制文件

java - 如何从 Java 中的 .dat 文件中读取一行然后需要将其分开?

c# - 使用 VB 的 FileSystem.DeleteFile 方法无法正常工作,将文件删除到 csharp 中的回收站