2012-05-11 88 views
0

我目前工作在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

'scanf函數(BUFF, 「%[^ \ n] \ n」,finbuff);'是不正確的,查找'sprintf' – keety

+0

@Keety你認爲什麼是錯的scanf? – lacrosse1991

+0

確定發現了sscanf的使它如此,而不是坐等,程序只是正常退出,但仍產生一個空行 – lacrosse1991

回答

1

如果ü要堅持本代碼只然後請檢查該行一次

memset的(淺黃色,0×00,1024);

我覺得有些問題是在這裏,如果有可能u到定義「BUFF」靜態分配不是動態再嘗試(字符的buff [256] = {0})。

OR

如果u可以選擇它來獲取最後一行:

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

希望這會有所幫助。

+0

感謝您的建議,實際上結束了使用不同的方法來找到最後一行,它完美地工作! – lacrosse1991

相關問題