2013-07-09 135 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