2013-07-09 158 views
-2

我有以下basket.txt文件如何閱讀txt文件

Center 
defence=45 
training=95 

Shooter 
points=34 
Rebounds=7 

Shooter 
points=8 
Rebounds=5 

Forward 
points=8 
Rebounds=5 

我想,只顯示了射手價值的一部分。要返回這樣的事情:

Shooter 
points=34 
Rebounds=7 

Shooter 
points=8 
Rebounds=5 

我的想法是通過線與中的strstr使用讀取文件行時找到字符串射手然後再打印一切在它上面。但是,下面的代碼

int main() 
{ 
    static const char filename[] = "basket.txt"; 
    FILE *file = fopen (filename, "r"); 
if (file!= NULL) 
{ 
    char line[128]; 
    while (fgets (line, sizeof line, file)!= NULL) 
    { 
     char *line1 = strstr(line,"Shooter"); 
     if (line1) 
     { 
     while (fgets (line, sizeof line, file)!= NULL) 
     fputs(line,stdout); 
     } 
    } 
fclose(file); 
} 
else 
{ 
    perror(filename); 
} 
return 0; 
} 

它返回我

Shooter 
points=34 
Rebounds=7 

Shooter 
points=8 
Rebounds=5 

Forward 
points=8 
Rebounds=5 

那麼,怎樣才能改變我的代碼,有我想要的結果?

UPDATE

我改變了while循環

while (fgets (line, sizeof line, file)!= NULL) 
    { 
     char *line1 = strstr(line,"Shooter"); 
     if (line1) 
     { 
      fgets (line, sizeof line, file); 
      while (line[0] != '\n') 
      { 
       fputs(line,stdout); 
       fgets (line, sizeof line, file); 
       break; 
      } 

但現在

points=34 
points=8 

結果是不退還我射擊的籃板。

+0

您在包含「射手」的第一行後打印_every line_。這個結果真的如此出乎意料嗎? (提示:什麼時候你的循環終止?) –

+0

「這不是我想要的結果」 - 那爲什麼不做你想要的?這當然正在做你正在告訴它。 –

+0

是的,我知道。所以問題是如何更改我的代碼以獲得我想要的結果。 – dali1985

回答

3
if (line1) 
{ 
    while (fgets (line, sizeof line, file)!= NULL) 
    fputs(line,stdout); 
} 

這是不對的,因爲fgets()不會返回NULL,直到文件結束。您要閱讀,直到遇到空行:

if (line1) { 
    fgets(line, sizeof line, file); 
    while (line[0] != '\n') { 
     fputs(line, stdout); 
     fgets(line, sizeof line, file); 
    } 
} 
+0

如果空白行實際上包含空白,則OP將不高興。 –

+0

@JimBalter的確。 (但是我再也沒有暗示它會這樣做,爲什麼我會這麼做)但是,如果你願意,它只是一個'strchr()'和映射'isspace()'到字符的問題,直到換行。 – 2013-07-09 12:39:38

+0

@ H2CO3再次感謝您的幫助。我用你的代碼更新了我的循環。我也用過,因爲沒有它,程序就不會停下來。但是這並沒有讓我看到籃板。你有什麼錯誤的想法嗎? – dali1985

0

您的內循環找到第一個射手,然後打印文件的其餘部分。

內循環必須停在第一個空行。例如:

while (line[0] != '\n') 
{ 
    fputs... 
    if (fgets(...) == NULL) 
     break; 
}

這在EOF條件下表現良好。

+0

你可以看看我的更新代碼嗎?正如你現在所看到的那樣,它只能讓我得到分數而不是籃板。 – dali1985