我目前正在用 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/