2012-11-25 69 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

哦完美。我不確定這些限制因此這就是爲什麼我不想過度使用,但這很好,我很高興你有一個解決方案! :) –