2015-09-30 18 views
1

我想從一個文件如何使用fscanf,關心endofline?

的第一行是由1個爲int和2

1 
2 3 

如果我做

fscanf(FILE, "%d \n %d %d", &a, &b, &c); 

我第二讀INT獲得正確的3個號碼 但如果我把所有的數字在文件 ,即在同一行

我獲得相同的結果(這不是我想要的)

我想知道:如何強制用戶去在他的文件中的新行?

編輯: ,因爲它似乎不清楚一些(我對此感到抱歉),我想,該文件

1 
2 3 

產生結果:

a = 1 
b = 2 
c = 3 

和文件

1 2 3 

產生一個錯誤或

a = 1 
b = 0 
c = 0 
+0

它很不清楚你想要什麼。 – ameyCU

+0

這裏你還不清楚,如果你正在從一個新行'\ n'分隔的文件中讀取數據,那麼你需要一個可以調用fgets()的循環,只要文件中沒有二進制數據。發佈您的程序的其餘部分,以便我們可以在這裏瞭解最終目標。 – Dave

+0

'int a,b,c; char temp [2]; if(fscanf(FILE,「%d%c%d%c%d」,&a,&temp [0],&b,&temp [1],&c)!= 5 || temp [0]!='\ n' || temp {1]!=''){/ *文件中的數據格式無效* /}' –

回答

2

fscanf(FILE, "%d", ...);在掃描int字符之前首先掃描並丟棄空白區域。在掃描空白區域時,' ''\n'都被視爲相同,因此使用'%d'會丟失行尾。

fscanf(FILE, "\n", ...);fscanf(FILE, " ", ...);做同樣的事情:掃描和丟棄任何白色空間。使用「\ n」而不是只能掃描'\n'

代碼可以使用fscanf(FILE, "%d%*1[\n]%d %d", &a, &b, &c) == 3,在a之後找到'\n',但其他'\n'可能潛伏在其他地方。

使用scanf()家庭檢測'\n'涉及使用'%c''%[]''%n'的唯一途徑。使用fgets()更容易,然後使用sscanf()strtol()進行解析。

int Read1and2int(FILE *stream, int *a, int *b, int *c) { 
    char buf[100]; 
    int n; 

    if (fgets(buf, sizeof buf, stream) == NULL) return EOF; 
    int count = sscanf(buf,"%d %n", a, &n); 
    // Non-numeric or extra data 
    if (count != 1 || buf[n]) return 0; 

    if (fgets(buf, sizeof buf, stream) == NULL) return 1; 
    count = sscanf(buf,"%d%d %n", b, c, &n); 
    // Non-numeric or extra data 
    if (count != 2 || buf[n]) return 1; 
    return 3; 
} 
3

您需要使用fgets將每行讀入char緩衝區,並分別用自己的sscanf解析每行。您可以在格式字符串的末尾使用額外的%s(以及char *類型的虛擬變量的額外指針參數)以檢測該行是否包含您要查找的字段之後的額外內容。

+0

我從來沒有想過爲什麼人們繼續教導[f] scanf,錯誤時會留下輸入流在一個幾乎未知的狀態。 fgets和sscanf是將閱讀和解析分開的方式。 – msw