我得到這一行:我想要的fscanf保持掃描甚至用空格輸入
fscanf(file, "%s %[^\t\n]", message);
時它會掃描我得到的所有的字符,直到空間現在,但我想它來閱讀,直到結束的線,而不是隻有一個空間。
我得到這一行:我想要的fscanf保持掃描甚至用空格輸入
fscanf(file, "%s %[^\t\n]", message);
時它會掃描我得到的所有的字符,直到空間現在,但我想它來閱讀,直到結束的線,而不是隻有一個空間。
在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循環中的條件確保文件沒有結束。
正如在評論中說的,獲取是一個非常危險的功能,不應該使用。
但是如果我想讓它讀到行的末尾(下一行有更多的信息)? – user2517841
EOL =行結束。這些函數讀取直到行結束。您可以在while循環中逐行讀取並驗證返回的值是否爲空(通常在達到文件結尾時發生)。 如果你想在一個字符串中讀取一個完整的文件,這意味着首先找出文件的大小,爲整個文件分配一個足夠大的字符串,而不是以二進制模式讀取文件。但不建議使用此方法。 –
我會避免提示'gets()',因爲沒有辦法可以安全地使用任意輸入。 –
這並不完全清楚你在做什麼。如果你想上線的所有數據到新行(和你想換行讀),那麼它是最易於使用的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);
fscanf()
的返回值,因此您不知道它是否有效。前兩個問題相當直接。最後不是。 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...
您可能還需要有一個看看這個問題:http://stackoverflow.com/questions/1950057/can-fscanf-read-whitespace –
我很驚訝,你沒有得到崩潰,因爲沒有地方爲'fscanf()'調用把它爲'%['讀入的數據轉換規格。 –