2016-04-21 61 views
1

讀書,我有一個文本文件,它看起來像:使用與fgets && sscanf的從一個數組

C M 2/1/2015 18280 "2107070770" 
C U 2/1/2015 18300 "2107070770" 

文本文件有多條線路。我試圖將 每行存儲到一個字符串數組中,然後將每個值 存儲到變量中,我想要使用它。 (我開的fopen成功文件)

我存儲與下面的方式每行:

char line[50]; 
char *lines[40]; 
char *eof ; 
int i ; 
while((eof = fgets(line, 50, in)) != NULL) 
{ 
    lines[i] = strdup(eof); 
    i++; 
} 

於是,我試圖存儲每個值轉換成變量,用下面的方法:

​​

所以,我可以分別在每一行工作。 我的代碼將每行成功存儲到數組中,但在添加sscanf函數後,它會停止工作,但不會輸出任何內容。 我做錯了什麼?

+1

'while((eof = fgets(line,50,in))!= NULL)' - >'while(fgets(line,50,in))',並且最後一個參數爲'scanf'你不需要傳遞一個地址,因爲'name'已經(或衰減)了一個指針。 –

+0

'i'在這裏沒有被初始化。默認情況下,自動變量沒有被初始化。 – sjsam

+0

七個轉換說明符。六個變量。未定義的行爲。你完蛋了。 ;-) – DevSolar

回答

3

對於線

C U 2/1/2015 18300 "2107070770" 

2015年後,你錯過的整數18300.您必須在格式字符串格式說明,但沒有相應的變量來存儲它。

手術後,目的地,天,月,年,missing_variable,名通過成功地檢查你的文件描述符

//so the right one will be 
// assuming name is a char* 

int my_int = 0; 
for(j = 0; j <= 39 ; j++) 
{ 
    sscanf(lines[j], "%c %c %d/%d/%d %d %s", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ;  

    /*printf("%s\n", lines[j]);*/ 
} 
+0

非常感謝!有沒有什麼辦法可以忽略引號\「? –

+0

你可能需要用自定義函數去掉 – padfoot

0

開始指向文件

if(in==NULL) 
    exit(-1); // Hope this is already in the code. 

變化

int i ; 

int i=0; // automatic variables are not initialized by default 

ISO/IEC 9899:201X 6.7.9-> 10

如果具有自動存儲持續時間的對象沒有初始化 明確地,它的值是不確定的。

正如有人指出你在sscanf中有一個缺失的變量。如果你想送的age後撕毀整個的東西,說18280 "2107070770"name,你可以不喜歡它:

sscanf(lines[j], "%c %c %d/%d/%d %d %[^\t\n]", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ; 

而且正如有人所指出的那樣name衰變爲指針,所以你不需要通過它像&name

+0

非常感謝!!有沒有辦法忽略引號\」? –

+0

將'%[^ \ t \ n]'更改爲'%[^「\ t \ n]'您可以看到我已經添加了一個引號,這被稱爲掃描集並在開始時使用'^'我們告訴scanf拒絕接受它後面的字符。如果你不使用'^',那麼它意味着只能從包含的字符集中讀取,例如'[a-zA-Z]'只讀取範圍 – sjsam

+0

請參閱[在C中的掃描集](http://www.geeksforgeeks.org/scansets-in-c/) – sjsam