2013-06-24 72 views
-1

我得到這一行:我想要的fscanf保持掃描甚至用空格輸入

fscanf(file, "%s %[^\t\n]", message); 

時它會掃描我得到的所有的字符,直到空間現在,但我想它來閱讀,直到結束的線,而不是隻有一個空間。

+0

您可能還需要有一個看看這個問題:http://stackoverflow.com/questions/1950057/can-fscanf-read-whitespace –

+1

我很驚訝,你沒有得到崩潰,因爲沒有地方爲'fscanf()'調用把它爲'%['讀入的數據轉換規格。 –

回答

-1

在C閱讀C字符串,你應該使用時獲得的,而不是scanf函數familly

char * gets (char * str); 

http://www.cplusplus.com/reference/cstdio/gets/?kw=gets

char * fgets (char * str, int num, FILE * stream); 

家庭

這些讀,直到EOL字符被發現或達到字符的一定限度(以沒有得到一個緩衝區溢出)

編輯

下面介紹如何通過閱讀整個文件行line

while (fgets (line, size_of_buffer , file) != NULL){ /* read a line */ 
    fputs (line, stdout); /* write the line */ 
} 

while循環中的條件確保文件沒有結束。

正如在評論中說的,獲取是一個非常危險的功能,不應該使用。

+0

但是如果我想讓它讀到行的末尾(下一行有更多的信息)? – user2517841

+0

EOL =行結束。這些函數讀取直到行結束。您可以在while循環中逐行讀取並驗證返回的值是否爲空(通常在達到文件結尾時發生)。 如果你想在一個字符串中讀取一個完整的文件,這意味着首先找出文件的大小,爲整個文件分配一個足夠大的字符串,而不是以二進制模式讀取文件。但不建議使用此方法。 –

+2

我會避免提示'gets()',因爲沒有辦法可以安全地使用任意輸入。 –

1

這並不完全清楚你在做什麼。如果你想上線的所有數據到新行(和你想換行讀),那麼它是最易於使用的fgets()

if (fgets(message, sizeof(message), file) != 0) 
{ 
    size_t len = strlen(message); 
    if (message[len-1] == '\n') 
     message[len-1] = '\0'; 
    else 
     ...line was too long to fit in message... 
    ...use message... 
} 

如果你必須使用fscanf(),那麼你可以使用:

char message[256]; 

if (fscanf(file, "%255[^\n]", message) == 1) 
{ 
    int c; 
    while ((c = getc(file)) != EOF && c != '\n') 
     ; // Ignore characters to newline 
    ...use message... 
} 

在你的版本,你有(至少)三個問題:

fscanf(file, "%s %[^\t\n]", message); 
  1. 你要轉換小號分配的特定,但你只提供一個變量。
  2. 您不檢查fscanf()的返回值,因此您不知道它是否有效。
  3. 您的格式字符串不會執行您認爲的操作。

前兩個問題相當直接。最後不是。 scanf()中的空格 - 家族格式字符串表示任意的空白序列(掃描集內除外)。因此,格式化字符串中的空白將讀取空格(空格,製表符,換行符等),直到輸入中的內容與空白不匹配爲止。這意味着用於多種目的的字母,數字或標點符號。然後,將這些字符序列讀入您在修復問題1時提供的變量。

#include <stdio.h> 

int main(void) 
{ 
    char msg1[256]; 
    char msg2[256]; 
    int n; 

    if ((n = scanf("%s %[^\t\n]", msg1, msg2)) == 2) 
    printf("1: <<%s>>\n2: <<%s>>\n", msg1, msg2); 
    else 
    printf("Oops: %d\n", n); 
    return 0; 
} 

採樣運行:

$ ./scan 
abracadabra 


      widgets 
1: <<abracadabra>> 
2: <<sigets>> 
$ 

如果你想閱讀高達message換行符(或標籤),那麼你需要:

if (fscanf(file, "%[^\t\n]", message) != 1) 
    ...oops... 
else 
    ...use message...