2011-07-22 20 views
1

我有一個具有第一線如下文本文件:錯誤在我的字符類的fscanf的使用

    j0W82LBrSdUbw    

基本上,它可以有很多的空間,開始然後有數字或字母的某些字符水平製表符(這個寬度是14個字符 - 固定的),然後可以存在更多的空間或製表符。整行的寬度是未知的,我的意思是它可以有任何數量的空格或製表符。我想忽略前後空格,但只將字母/數字轉換爲字符串。

我試着用字符類fscanf讀取它,如下圖所示(我嘗試了幾種方法但沒有成功),但結果不正確,它不讀取和忽略空格,也沒有讀取實際的字母。爲測試目的,我固定線路的整個長度54個字符中的所有(白色空格,數字字符都包括在內)

fscanf(fin,"%54*[ ]%[^ ]%*[ ]",s);//s is char array char s[100]; 

fscanf(fin,"%54[^ \t]",s); 

1]如何分析此使用的fscanf當寬度線是固定的,已知的說54個字符。

2]當行寬未知且變量?

3]我在哪裏可以閱讀關於在scanf/fscanf中使用字符類的好文檔?

+1

不會有一個簡單的'fscanf(fin,「%14s」,s);'工作嗎? ''%s「'轉換說明符去掉前導空格。另請注意,您的示例有13個可見字符,而不是14. – pmg

+0

'scanf/fscanf'是解析文本數據的不好選擇。你最好用'fgets'和'sscanf';或者用'fgetc'更好。我建議你不要再用'scan'系列函數來分析你的文件。 – pmg

+0

「'%''''scanf'轉換說明符(它不是一個正則表達式,只是一堆字符)沒有什麼特別的。它匹配(或者如果第一個字符是「^」),則匹配下列所有字符(對於'']''有一些額外的規則;並且在某些實現中,是'''')。查看任何[手冊頁](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html)瞭解詳情:我喜歡[OpenGroup's manual](http://pubs.opengroup.org/onlinepubs/) 9699919799 /)。 – pmg

回答

1

嘗試使用fgetc()進行循環。您可能需要添加錯誤檢查和臨界病例治療。

char s[15]; 
size_t sndx = 0; 
int ch; 
while (((ch = fgetc(fin)) != '\n') && (ch != EOF) && (sndx < 15)) { 
    if (sndx || !isspace((unsigned char)ch)) { 
     s[sndx++] = ch; 
    } 
} 
s[sndx] = 0; 
/* discard rest of line */ 
while (((ch = fgetc(fin)) != '\n') && (ch != EOF)) /* void */; 
+0

謝謝。一個簡單的fscanf(fin,「%14s」,s);工作。我不知道%s ingnores領先的白色空間(我只知道它停止在白色空間閱讀!) – goldenmean

+0

關於一些文章閱讀有關scanf字符類行爲的任何指針? – goldenmean

1

你不能在這裏使用[...]結構。它匹配一個非空字符序列。

只需使用簡單的"%s"格式,它會自動忽略空白字符。爲了增加安全性,請使用"%14s",以便無效的輸入字符串不會影響緩衝區。