2012-11-19 30 views
0

我需要在文本文件中存儲兩個整數,然後是文本的行。我已經成功地通過將每個int寫入一行並將每行文本寫入新行來成功完成它。然而,爲了閱讀它,我發現了一些麻煩。我這樣做:C - fscanf讀取兩個整數然後字符串

FILE *f = fopen(arquivo, "r"); 
char *lna = NULL; 
fscanf(f, "%d\n%d\n", &maxCol, &maxLin); 
//↑This reads the two ints, works fine in step-by-step 
for (;;) { 
    fscanf(f, "%s\n", &lna); 
    //↑This sets lna to NULL always, even if there are more lines 
    if (lna != NULL) 
     lna[strlen(lna) - 1] = '\0'; 
    if (feof(f)) 
     break; 
    inserirApos(lista, lna, &atual); 
} 
fclose(f); 

我嘗試了幾種不同的方式,但他們從來沒有工作。我知道我可以像字符串一樣讀取字符串,但是如果字符串包含空格,我認爲這有問題。我想知道我做的方式是否最好,以及它有什麼問題。我發現這些方法中的一種(也沒有效果),你必須通過每行的最大長度。如有必要,我知道這些信息,這是我之前閱讀的maxCol。

回答

2
fscanf(f, "%s\n", &lna); 

是錯誤的參數類型。格式爲%s需要char*作爲參數,但您給它一個char**。你還沒有分配內存給那個指針。 fscanf預計char*指向足夠大的內存區域。

char *lna = malloc(whatever_you_need); 
... 
    fscanf("%s ", lna); 

(在fscanf格式'\n'' '之間沒有差異。既消耗的非空白字符後面的字符串整個空白掃描的INT lna。)

+0

Thnaks!這些都是我的兩個錯誤。現在它完美的工作! –

1

您需要先爲lna分配空間。

char *lna = malloc(MAX_SIZE);//MAX_SIZE is the maximum size the string can be + 1 

附加參數應該指向格式字符串內由其對應格式說明符指定的類型的已分配對象。

+0

請[不投射返回值(),在C](http://stackoverflow.com/a/605858/28169)。 – unwind

+0

謝謝放鬆。不知道。當我開始用C編程時,它仍然是強制性的......現在我主要使用C++,它也是強制性的。 – Burkhard

1

您似乎期待fscanf()爲您動態分配字符串;這根本不是它的工作原理。這是未定義的行爲。

相關問題