使用fscanf读取时包含换行符
使用使用fscanf读取时包含换行符,c,file,scanf,stdio,C,File,Scanf,Stdio,使用fscanf()逐字读取文件时,如何读取(n可选)换行符 我知道我可以使用fgets()+strtok(),但我的程序特别需要fscanf() 我尝试了以下方法: fscanf(fp, "%s%[\n]+", buf); 但是它根本不起作用。您可以使用此转换格式使用并忽略单个换行符:%*1[\n]。它最多使用一个换行符并丢弃它。请注意,如果有多个连续的换行符,则仅跳过第一个换行符。还要注意,fscanf()将读取一个额外的字节,以验证它是否匹配。如果此字节不匹配,将使用ungect()将其
fscanf()
逐字读取文件时,如何读取(n可选)换行符
我知道我可以使用fgets()
+strtok()
,但我的程序特别需要fscanf()
我尝试了以下方法:
fscanf(fp, "%s%[\n]+", buf);
但是它根本不起作用。您可以使用此转换格式使用并忽略单个换行符:
%*1[\n]
。它最多使用一个换行符并丢弃它。请注意,如果有多个连续的换行符,则仅跳过第一个换行符。还要注意,fscanf()
将读取一个额外的字节,以验证它是否匹配。如果此字节不匹配,将使用ungect()
将其推回流中
如果使用%*[\n]
,fscanf
将一直读取流,直到它获得与换行符不同的字节或到达文件末尾,这将在处理来自终端的交互输入时导致意外行为
您的代码fscanf(fp,“%s[\n]”,buf)代码>导致未定义的行为,因为您没有为换行符提供目标数组。此外,它还有另一个缺陷,因为您没有指定要存储到buf
中的最大字节数,从而导致在输入长单词时出现未定义的行为
试试这个:
char buf[100];
if (fscanf(" %99s%*1[\n]", buf) == 1) {
printf("read a word: |%s|\n", buf);
} else {
printf("no more words\n");
}
如果要在缓冲区中包含换行符,则需要将其存储到变量中并手动添加:
#include <stdio.h>
#include <string.h>
int main() {
for (;;) {
char buf[100];
char nl[2] = "";
int n = fscanf(stdin, " %98s%1[\n]", buf, nl);
if (n > 0) {
strcat(buf, nl);
printf("read a word: |%s|\n", buf);
} else {
printf("no more words\n");
break;
}
}
return 0;
}
输出:
read a word: |Hello|
read a word: |word
|
read a word: |I|
read a word: |am|
read a word: |ready|
no more words
跳过单词前的空格,而不是单词后的空格<代码>fscanf(fp,“%s”,buf)
%s
隐式跳过前导空格。@chux Nope。我需要将每行的最后一个字读作“test\n”。听起来像是一个@chux 200字符说明:“
在%99s%*1[\n]”
中不需要。此外,这将阻止,直到输入一个非空白。我已经尝试了你的代码,并得到了同样的问题。我应该得到类似“test\n”的内容作为一行的最后一个字,但我只得到“test”。很抱歉打扰您,但我必须阅读多行,并且我不知道何时添加“\n”,因此我需要fscanf()来为我做这件事。@user10480767:上面的代码只有在单词后面出现时才会包含新行。它会忽略单词前面的空格,你可以在循环中调用它,但是其他的换行符会被忽略。也许只是我,但它不想工作。我也尝试过调试,但它甚至没有读取“\n”。我错过了什么?我已经复制了你的全部代码D:
read a word: |Hello|
read a word: |word
|
read a word: |I|
read a word: |am|
read a word: |ready|
no more words