我得到了这句话:
fscanf(file, "%s %[^\t\n]", message);
现在当它扫描时,我得到所有的字符,直到空格,但我希望它读取直到行的结尾,而不是只有一个空格。
答案 0 :(得分: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);
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...
答案 1 :(得分:-1)
在C中读取C String时,你应该使用gets family而不是scanf familly
char * gets ( char * str );
http://www.cplusplus.com/reference/cstdio/gets/?kw=gets
char * fgets ( char * str, int num, FILE * stream );
http://www.cplusplus.com/reference/cstdio/fgets/
这些读取直到找到EOL char或达到某个字符限制(为了不获得缓冲区溢出)
修改强>
以下是逐行读取整个文件的方法
while ( fgets ( line, size_of_buffer , file ) != NULL ){ /* read a line */
fputs ( line, stdout ); /* write the line */
}
while循环中的条件确保文件没有结束。
如评论中所述,获取是一项非常危险的功能,不应使用。