2013-11-15 80 views
0

輸入的C最好的辦法大家好即時通訊很新的C語言編程,我試圖從包含該信息的簡單文本文件閱讀:閱讀從這個測試文件和測試EOF

13 11 2011 13 10 00 GS452 45 20 
    13 11 2011 15 14 23 EI597 60 30 
    13 11 2011 15 34 35 EI600 20 15 

當前我正在使用fscaf來讀取整行,然後將它們存儲在我的結構中的正確變量中。我在網上查了一下,似乎檢查EOF並不像看起來使用fscanf那樣直截了當,因爲它會返回讀取的「項目」數量。

用我下面的代碼和上面的文件:

1),這是閱讀,並從文件中的信息存儲在正確的位置

2)檢查EOF的最佳方式的最佳途徑所以它停止並且文件/結尾不讀取空文件。

頭文件

#ifndef MAYDAY_STRUCT_H 
    #define MAYDAY_STRUCT_H 

    #ifdef __cplusplus 
    extern "C" { 
    #endif 

typedef struct { 
    /* unsigned because these values cannot be negative*/ 

    unsigned int day; 
    unsigned int month; 
    unsigned int year; 
    unsigned int hour; 
    unsigned int mins; 
    unsigned int secs; 
    char ais[5]; 
    unsigned int l_boat_time; 
    unsigned int heli_time; 


} mayday_call; 

void read_may_day_file(); 

#ifdef __cplusplus 
} 

的main.c

#include <stdio.h> 
    #include <stdlib.h> 
    #include "mayday_struct.h" 


int main(int argc, char** argv) { 


read_may_day_file(); 


return (EXIT_SUCCESS); 
} 

void read_may_day_file() { 

char locof[30]; 
char eofTest; 
mayday_call mday; 



printf("please enter the location of the input file \n"); 
scanf("%s", locof); 

FILE *fp; 
fp = fopen(locof, "r"); 


if (fp) { 



     fscanf(fp, "%d %d %d %d %d %d %s %d %d", &mday.day, &mday.month, &mday.year, &mday.hour, &mday.mins, &mday.secs, mday.ais, &mday.l_boat_time, &mday.heli_time); 


     printf("reading file mayday_1.txt \n" 
       "day %d \n" 
       "month %d \n" 
       "yr %d \n" 
       "hour % d\n" 
       "mins %d \n" 
       "sec %d \n" 
       "ais %s \n" 
       "lBoattime %d\n" 
       "helitime %d \n", mday.day, mday.month, 
       mday.year, mday.hour, mday.mins, mday.secs, mday.ais, mday.l_boat_time, mday.heli_time); 

     fclose(fp); 
    } 

} 

回答

0

所以我會建議使用fgets它將從文件裏逐行讀取,並返回NULL時,有什麼可看。如果一切都在你的情況是在同一條線上,我可能會堅持使用fscanf,但你也可以使用strtok和整行的讀取,然後通過它使用strtok

解析看看這裏更多的一些信息:http://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm

如果您打算使用fscanf您是在說它返回的是讀取的數量,所以如果沒有讀取任何內容,那麼您已到達文件末尾。

不要忘了你也必須打開你想要閱讀的文件,並在完成後關閉它們。

+0

我看着那個,但我不確定如何從fgets傳輸信息,因爲它將數據存儲到我的變量中。正如我所說,我對C新手,但不會將11號讀作1 1? (2個單獨的1個字符) –

+0

@chrisedwards不是我所知...它會讀取整個行,然後你如果使用'strtok'並將分隔符設置爲一個空格(這是我所假設的每個數字之間用)然後你可以使用'atoi'或'strtol'來將該字符串轉換爲int。 – Adjit

+0

另外,如果你正在使用'fscanf',我想我會這樣做,建立一個'while'循環來說'while(fscanf(...)!= EOF)',並且這個循環會一直保持直到沒有任何東西讀書。 – Adjit