使用fscanf()忽略换行符

使用fscanf()忽略换行符,c,file-io,C,File Io,我正在使用fscanf()函数读取一个多行文件。我希望忽略换行符,但不忽略文件中可能存在的其他空白字符。我如何才能最好地做到这一点?我认为这符合您的要求: char ch[2]; while (fscanf(fp, "%1[^\n]%*[\n]", ch) == 1) putchar(ch[0]); 第一个格式说明符最多读取一个不是换行符的字符,并将其存储在字符串ch中,第二个格式说明符读取换行符,但抑制赋值。此循环的结果是打印文件中的所有字符,跳过换行符,直到EOF @AnT在评论中

我正在使用
fscanf()
函数读取一个多行文件。我希望忽略换行符,但不忽略文件中可能存在的其他空白字符。我如何才能最好地做到这一点?

我认为这符合您的要求:

char ch[2];
while (fscanf(fp, "%1[^\n]%*[\n]", ch) == 1)
    putchar(ch[0]);
第一个格式说明符最多读取一个不是换行符的字符,并将其存储在字符串
ch
中,第二个格式说明符读取换行符,但抑制赋值。此循环的结果是打印文件中的所有字符,跳过换行符,直到
EOF

@AnT在评论中指出,对于以换行符开头的文本文件,此方法将失败,并建议了修复方法:在禁止赋值的同时读取换行符的循环之前调用
fscanf()
。改进后的代码是:

char ch[2];
fscanf(fp, "%*[\n]");
while (fscanf(fp, "%1[^\n]%*[\n]", ch) == 1)
    putchar(ch[0]);

如果您只想忽略换行符,那么使用
getc()
比使用
fscanf()
更简单、更有效:

您可以将其调整为要对文件内容执行的任何处理


fscanf()
是一个非常笨重的文件解析界面,除了
%c
%[
转换说明符外,它对空格、换行符和其他空白字符的处理方式相同。另一种方法是使用
getc()
fgets()
fread()看起来更适合你的需要。

你需要先选择一种语言,首先是C或C++。它们是不同的语言。你想解析什么格式?@ SavaVaveCKK我用C,但是这不是C++中的遗留函数吗?熟悉C++的人应该熟悉FSCAN()。@chqrlie我正在处理常规文本文件。所有这些文件都包含重要的空格字符,这就是为什么我不想删除所有空格;只有换行符为什么不使用
fgets()
?问题是,如果输入以newline.Hrmmmm开头,则此
fscanf
将立即失败并退出循环。您是正确的@AnT。但您不能只执行
scanf(%*[\n]”)
在循环之前?你也可以!我试图将其包含在我的原始格式字符串中,但没有效果。我想我需要一些睡眠!谢谢,@AnT。
void copy_ignoring_newline(FILE *fin, FILE *fout) {
    int c;
    while ((c = getc(fin)) != EOF) {
        if (c != '\n')
            putc(c, fout);
    }
}