2012-11-25 70 views
0

写这个程序应该能够打印出txt文件中的所有行,但它只打印一个,现在已经查看了一个小时,我找不到这个错误,帮助将appriciated! :)程序将不会打印所有来自txt文件的行

1 16.07.2011 kl。 17.00 OB - FCN 2 - 0 6.965
1 17.07.2011 kl。 14.00 FCM - SIF 1 - 2 5.370
1 17.07.2011 kl。 16.00 ACH-HBK 3 - 0 2.227
1 17.07.2011 kl。 16.00 SDR - FCK 0 - 2 4.992
前4行。

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_LINE_LGT 200 
#define NAME_MAX 200 
#define TEAM_MAX 200 

struct team{ 
char name[NAME_MAX]; 
int five_or_more_goals; 
}; 
typedef struct team team; 

void read_data_1(const char *file_name, team teams[]){ 
FILE *ifp; 
char team1[NAME_MAX]; 
char team2[NAME_MAX]; 
int goal1, goal2; 
int dag, month, year; 
double clock; 
int attendance; 
int round; 
team local_match; 

ifp = fopen(file_name, "r"); 

while (fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %d\n", &round, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10){ 
    printf("runde %d den %d %d %d klokken %.2lf, mellem %s og %s endte %d - %d %d så kampen\n", round, dag, month, year, clock, team1, team2, goal1, goal2, attendance); 
    } 

fclose(ifp); 

    } 

    int main(void) { 
    team all_matches_teams[TEAM_MAX]; 
    read_data_1("superliga-2011-2012", all_matches_teams); 

return 0; 
} 
+1

如果没有看到您的文件,就不可能知道发生了什么。实际上,甚至不是整个文件:前三四行就足够了。 – dasblinkenlight

+2

我会从格式化字符串的末尾移除'\ n' - 它会被忽略,最后一行可能不包含一个。 – dasblinkenlight

+0

fscanf第二次返回什么? –

回答

1

您在每行输入结束时的出席值会导致您遇到问题。你需要将它解析为一个浮点数或两个小数点,而不是一个小数点。它应该与下面的代码修改工作,假定考勤从未达到一百万:

int valuesRead; 
int attendance; 
int attend1, attend2; 
[...] 
while ((valuesRead = fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %d.%d\n", &round, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attend1, &attend2)) >= 10){ 
    if (valuesRead == 11) 
     attendance = attend1 * 1000 + attend2; 
    else 
     attendance = attend1; 
    printf("runde %d den %d %d %d klokken %.2lf, mellem %s og %s endte %d - %d %d så kampen\n", round, dag, month, year, clock, team1, team2, goal1, goal2, attendance); 
} 
+0

添加一些文本我得到一个分段错误(核心转储) 检查scanf和printf,看看是否匹配 – Winkz

+0

似乎我不能让它运行,仍然分段错误(核心转储) – Winkz

0

感谢您输入家伙,我得到它现在的工作,只需更改出席变量为双并能正常工作,继承人该代码再次,如果有人有任何提示写它更聪明,请让我知道! :)

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_LINE_LGT 200 
#define NAME_MAX 200 
#define TEAM_MAX 200 

struct team{ 
char name[NAME_MAX]; 
int five_or_more_goals; 
}; 
typedef struct team team; 

void read_data_1(const char *file_name, team teams[]){ 
FILE *ifp; 
char team1[NAME_MAX]; 
char team2[NAME_MAX]; 
int goal1, goal2; 
int dag, month, year; 
double clock; 
double attendance; 
int round; 
team local_match; 

ifp = fopen(file_name, "r"); 

while (fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %lf\n", &round, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10){ 
    printf("runde %d den %d %d %d klokken %.2lf, mellem %s og %s endte %d - %d %.3lf så kampen\n", round, dag, month, year, clock, team1, team2, goal1, goal2, attendance); 
    } 

fclose(ifp); 

    } 

    int main(void) { 
    team all_matches_teams[TEAM_MAX]; 
    read_data_1("superliga-2011-2012", all_matches_teams); 

    return 0; 
    } 
+0

很高兴看到它,但有一点评论:目前如果出席人数低于1000,则说'x',您的出席人数为x.000。这就是我认为将整体值处理的原因,尽管我想我发布的答案应该更加健壮。 –

+0

啊我看到,可以看到,可能会导致问题,但感谢上帝theres没有出席在1000以下赫赫:)即时通讯仍然是新的C,但非常感谢您的输入 – Winkz

+0

哦完美。我不确定这些限制因此这就是为什么我不想过度使用,但这很好,我很高兴你有一个解决方案! :) –