2016-11-12 99 views
-3

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

+3

您需要先选择一种语言。 C或C++。他们是不同的语言。 –

+1

你想要解析什么格式? – chqrlie

+0

@SamVarshavchik我使用C,但是这不是在C++中的传统功能?熟悉C++的人应该熟悉fscanf() – piper1935

回答

0

我认为这确实你问:

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]); 
+0

这样做的问题是,如果输入以换行符开始,此'fscanf'将立即失败并退出循环。 – AnT

+0

Hrmmmm。你是对的@AnT。 –

+0

但是你不能只是做'scanf(“%* [\ n]”);'在循环之前? – AnT

0

如果你只在忽略换行符兴趣,使用getc()比使用fscanf()更简单,更高效:

void copy_ignoring_newline(FILE *fin, FILE *fout) { 
    int c; 
    while ((c = getc(fin)) != EOF) { 
     if (c != '\n') 
      putc(c, fout); 
    } 
} 

可以适应这个给你想要的任何处理在文件内容上执行。

fscanf()是解析文件非常笨重的接口,它把空格,换行和其他空白字符相同,除了%c%[转换说明。 getc(),fgets()fread()的替代方法似乎更适合您的需求。