fgets和fscanf对换⾏符的处理
fgets 和 fscanf 对换⾏符的处理
fscanf
int fscanf ( FILE * stream, const char * format, ... );
fscanf 将读取并忽略在下⼀个⾮空⽩字符之前遇到的任何空⽩字符(空⽩字符包括空格、换⾏符和制表符)。
fscanf 读取字符串时,读取任意数量的⾮空⽩字符,在到的第⼀个空⽩字符处停⽌。在存储序列的末尾⾃动添加终⽌空字符。
fgets
char * fgets ( char * str, int num, FILE * stream );
fgets和fgetc的区别换⾏符使 fgets 停⽌读取,但它被函数视为有效字符并包含在复制到 str 的字符串中。
fgets 只能读取 num - 1 个字符,包括最后的换⾏符,在复制到 str 的字符后⾃动附加终⽌空字符。
验证实例
总之,fscanf 不会读取换⾏符,读取之前会跳过所有换⾏符,读到换⾏符停⽌(流中的换⾏符还在)。
fgets 读取⼀⾏,读到换⾏符为⽌,但会读掉换⾏符(流中的换⾏符没有了)。
因此,如果使⽤了 fscanf 读取⼀⾏的内容,流中会剩余⼀个换⾏符,再使⽤ fgets 只会读到这个剩余的换⾏符,不会读取下⼀⾏。需要再使⽤ fgets 才能读取下⼀⾏。
#include <stdio.h>
int main() {
FILE *fp = fopen("", "r");
char line[20];
int a, b, c;
fscanf(fp, "%d %d %s", &a, &b, line);
fprintf(stdout, "%s", line);  // String1
fgets(line, 20, fp);
fprintf(stdout, "%s\n", line);  // '\n'
fgets(line, 20, fp);
fprintf(stdout, "%s", line);    // String2
}
[qhn@Tommy C_Prog]$ ./a
String1
String2
Breakpoint 1, main () at test.c:12
12          printf("%s", line);  // '\n'
(gdb) print(line)
$1 = "\n\000ring1\000@\005@\000\000\000\000\000\340\340\377\377"
12 ⾏不打印任何字符的原因参考。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。