Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1749363
  • 博文数量: 143
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(143)

文章存档

2022年(3)

2021年(13)

2020年(21)

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: C/C++

2018-02-22 16:38:58

fgets
  从文件流stream中读取少于size个(即size-1)字符到缓冲区s中,直到出现换行符"\n"或者end-of-file符时结束操作,遇到"\n"时任将其保存到s中,自动在s的最后加"\0"。
  当读入过程中遇到EOF或发生错误,函数返回NULL指针时,此时可以用 feof() 和 ferror() 来判断函数是遇到EOF还是发生错误。
常见用法:
1.常见的fgets的几种写法:
  首先,我们准备好一个2.txt的文件,内容如下:

点击(此处)折叠或打开

  1. 123
  2. abc
  然后,我们看看如下3种常见写法:
  

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char line[256] = {0};
  5.     FILE *fd = fopen("2.txt", "r");

  6.     if(!fd)
  7.     {
  8.         printf("fopen fail\n");
  9.         return -1;
  10.     }

  11.     while(!feof(fd))
  12.     {
  13.         fgets(line, sizeof(line), fd);
  14.         printf("%s", line);
  15.     }
  16.     fclose(fd);
  17.     return 0;
  18. }
  ②

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char line[256] = {0};
  5.     FILE *fd = fopen("2.txt", "r");

  6.     if(!fd)
  7.     {
  8.         printf("fopen fail\n");
  9.         return -1;
  10.     }

  11.     while(!feof(fd) && !ferror(fd))
  12.     {
  13.         fgets(line, sizeof(line), fd);
  14.         printf("%s", line);
  15.     }
  16.     fclose(fd);
  17.     return 0;
  18. }
  以上2种写法,每次输出时最后一行都重复输出,这是因为fgets读取完最后一行后立即正常结束读取,此种情况下未更新line内容导致。
  ③

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char line[256] = {0};
  5.     FILE *fd = fopen("2.txt", "r");

  6.     if(!fd)
  7.     {
  8.         printf("fopen fail\n");
  9.         return -1;
  10.     }

  11.     while(fgets(line, sizeof(line), fd))
  12.     {
  13.         printf("%s", line);
  14.     }
  15.     fclose(fd);
  16.     return 0;
  17. }
  而第3种写法,就是OK的
参考:fgets重复读取最后一行,都是feof惹的祸 文件流中读行的正确使用(fgets、feof、ferror)
2.常见的fgets用于匹配特定字符串的两种写法
  ①fgets+strncmp

点击(此处)折叠或打开

  1. while(fgets(line, sizeof(line), fd) && strncmp(line, "abc", strlen("abc")) == 0)
  2. {
  3.     ...
  4. }
  ②fgets+strstr

点击(此处)折叠或打开

  1. while(fgets(line, sizeof(line), fd) && strstr(line, "abc"))
  2. {
  3.     ...
  4. }

fscanf
  返回值:该函数返回成功匹配并赋值的元素个数,个数可能会少于实际输入参数的个数,甚至可以是0当第一个元素都失败的话。在第一个成功转换或匹配失败之前就已经到了末尾或者有读错误时,则其返回值为EOF(-1)。
常见用法
  1.使用fscanf(fp, "%s %d", a, &b);去匹配hello 5返回值是2,OK的。但是使用fscanf(fp, "%s,%d", a, &b);去匹配hello,5返回值是1,a的值是hello,5,失败的。但是使用fscanf(fp, "%u,%d", &a, &b);去匹配2,5返回值是2,也是OK的。
  2.根据定义使用while(fscanf(fp, "%u,%d", &a, &b) > 0)去匹配多行数据时,如下数据:
2,hello
  会出现返回值为1,b没有被赋值,但却成功了。
  而若使用while(fscanf(fp, "%u,%d", &a, &b) == 2)去匹配多行数据时,如下数据:
2,5
3,6,7
4,7
  读到第二行后,就不会继续读第三行了。
  若使用while(!feof(fp)){fscanf(fp, "%c", &ch);printf("%c", ch);}去匹配多行数据时,如下数据:
abcdefg
  会出现实际输出的是abcdefgg,最后一个字符被输出了两次。原因,见网上feof。
  3.多行输入时,fscanf(fp,"%[^\n]",szbuff);文件指针在读到"\n"时停止,不能越过,所以后面的内容fp指不到;这时我们解决办法是:fscanf和fgetc连用解决。输入一条fscanf(fp,"%[^\n]",szbuff);后面紧跟一条fgetc(fp);指针即可越过"\n"。
阅读(3513) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~