Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用fscanf读取时包含换行符_C_File_Scanf_Stdio - Fatal编程技术网

使用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