我目前正在使用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);
}
答案 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;
}
希望这会有所帮助。