2009-12-01 87 views
0

如何讀取用分號分隔的不同數據記錄到C中的數組中?讀取以分號分隔的文本文件中的不同數據C

from textfile:Text One; 12.25;文字二; 5;正文三; 1.253

fopen ... 
for(i = 0; i < nrRecords; i++) { 
fscanf(myFile, " %[^;];", myRecords[i].firstText); /* Ok first text*/ 
fscanf(myFile, "%lf", &myRecords[i].myDouble1);  /* But goes wrong with first double */ 
fscanf(myFile, " %[^;];", myRecords[i].secondText); 
fscanf(myFile, "%d", &myRecords[i].myInt1);  
fscanf(myFile, " %[^;];", myRecords[i].thirdText); 
fscanf(myFile, "%lf",&myRecords[i].myDouble2);  
} 
fclose... 
+0

如果以字符串形式讀取每個字段%[^;],是否會得到正確的文本(例如,第二個字段中的「12.25」)? – 2009-12-01 09:57:36

+0

沒問題,我正在將它讀入帶有「固定」類型的structarray。 – 2009-12-01 10:13:06

+1

我試過了,它工作正常。你可以顯示myRecord結構的定義嗎? – bhups 2009-12-01 10:14:10

回答

-1

的一種方法是使用strtok。然後以int或float形式輸入結果。

1

通常的建議是讀整行,然後用sscanf或strtok或其他方法解析它。如果直接從文件中直接掃描,則很容易在輸入文件中丟失位置。 (即第一次不匹配,你需要一種方法來跳過它,除非你想在那裏中止)。

+0

如何容易失去你的位置?跳過其餘部分並不難,如果你錯誤地拋棄了當前行,那麼這就是你所做的一切:'void ignoreline(FILE * f){char c; for(;;)switch(fgetc(f)){case'\ n':case EOF:return;默認:; ''。 – 2010-02-22 09:54:58

0

我會用fgets從文件中讀取一行,strtok將其打開分號strcpy複製字符串,strtod轉換爲double並且strtol轉換爲long(然後轉換爲整數)。

或者,閱讀該行並使用狀態機遍歷每個字符並執行正確的操作。例如,您要將每個字符複製到firstText中,直到您達到分號,然後使用strtod來吃掉double,跳過分號,將字節複製到secondText等。

或者,使用單個scanf格式串破線下行到各個領域

fscanf(myFile, " %[^;];%lf;%[^;];%d;%[^;];%lf", 
    myRecords[i].firstText, 
    &myRecords[i].myDouble1, 
    myRecords[i].secondText, 
    &myRecords[i].myInt1, 
    myRecords[i].thirdText, 
    &myRecords[i].myDouble2); 

而且,正如其他人所說,檢查fscanf返回值。

我更喜歡每次閱讀一行,以避免出現單行不良行,導致後續所有轉換失敗。

相關問題