2

我目前正在将一个日志解析脚本从 bash 重写为 C,我只是想知道是否可以就如何设置名为 buffer 的数组动态扩展而不是限制为 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

从您的代码看来,您只是想从打开的文件中打印最后一行。您可以只寻找文件的末尾并向后搜索倒数第二个 '\n',然后从那时起一次将多达 1024 个字节读入缓冲区并将它们打印到屏幕上。在这种情况下,您不需要重新分配 buff。

编辑:每次最多读取 1023 到 buff 并始终让 buff[1023] = '\0' 。

于 2012-05-09T19:09:07.723 回答