2011-05-24 85 views
1

我應該得到一個文件並掃描信息。當我嘗試將其打印出來時,我掃描的大部分信息都會丟失或切斷。這裏是我的代碼:沒有正確掃描一切的代碼

M 
111223333 
Rob Low 
47 
Actor 
1000000 
Dancing 
Painting 
63 
165 
Atheist 

M 
123456789 
Bob Mitchell 
77 
Driver 
25000 
Baseball 
Cooking 
72 
275 
None 

和部分得到什麼打印出來:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct profile { 

    char gender; 
    float soc; 
    char name[20]; 
    char name2[20]; 
    int age; 
    char job[20]; 
    float income; 
    char M_hob[20]; 
    char m_hob[20]; 
    int height; 
    int weight; 
    char relig[20]; 
} PROFILE; 

int main(void) 
{ 

    int i, count; 
    char file[30], ssn[10]; 
    FILE *fin; 
    PROFILE members[50]; 

    printf("SSN: "); 
    scanf("%s", ssn); 
    printf("Name of file of records: "); 
    scanf("%s", file); 

    fin = fopen(file, "r"); 

    if ((fin == NULL)) { 
     printf("Can't Open File"); 
     exit(1); 
    } 

    i = 0; 
    while (fscanf(fin, "%c", &members[i].gender) != EOF) { 

     fscanf(fin, "%f", &members[i].soc); 
     fscanf(fin, "%s", members[i].name); 
     fscanf(fin, "%s", members[i].name2); 
     strcat(members[i].name, members[i].name2); 
     fscanf(fin, "%d", &members[i].age); 
     fscanf(fin, "%s", members[i].job); 
     fscanf(fin, "%f", &members[i].income); 
     fscanf(fin, "%s", members[i].M_hob); 
     fscanf(fin, "%s", members[i].m_hob); 
     fscanf(fin, "%d", &members[i].height); 
     fscanf(fin, "%d", &members[i].weight); 
     fscanf(fin, "%s", members[i].relig); 
     fscanf(fin, "%c", &members[i].space); 

     i++; 
    } 
    fclose(fin); 

    count = i; 
    for (i = 0; i <= count; i++) { 
     printf("%c\n", members[i].gender); 
     printf("%.0f\n", members[i].soc); 
     printf("%s\n", members[i].name); 
     printf("%d\n", members[i].age); 
     printf("%s\n", members[i].job); 
     printf("%.0f\n", members[i].income); 
     printf("%s\n", members[i].M_hob); 
     printf("%s\n", members[i].m_hob); 
     printf("%d\n", members[i].height); 
     printf("%d\n", members[i].weight); 
     printf("%s\n", members[i].relig); 
    } 

    return 0; 
} 

兩個就是我的掃描段

M 
111223336 
Rob 
47 
Actor 
1000000 
Dancing 
Painting 
63 
165 
Atheist 

0 
M 
0 
Bob 
0 
Mitchell 
77 
0 
0 
Driver 
2 
5000 
Baseball 
72 
275 
0 
ne 

正如你所看到的第一個得到完美掃描,但其餘的都是越野車。

+0

請看看輸出並確保我在第一個和第二個記錄之間正確放置了一個空行。 – sarnold 2011-05-24 02:46:40

+0

對於初學者來說,這會導致一個問題,因爲(i = 0; i <= count; i ++){'它應該從i = 0到i judda 2011-05-24 02:47:31

+0

@ judda,幫了一下,但它仍然輸出奇怪/不完整的結果 – 2011-05-24 02:54:46

回答

1

如果您必須使用fscanf(),請檢查每個返回值。

擔心在循環前面的%c在第二個循環中得到一個換行符或附近。

你最好把每一行讀成一個大字符串,然後應用sscanf()它。這至少可以避免對換行符的混淆。 (我不會觸摸scanf()fscanf(),因爲它們處理換行符的方式 - 或不是。)

+0

謝謝sooo多!!! – 2011-05-24 03:17:18

+0

+1特別針對或檢查每個返回值。 – mattnz 2011-05-24 04:35:51