fgets
从文件流stream中读取少于size个(即size-1)字符到缓冲区s中,直到出现换行符"\n"或者end-of-file符时结束操作,遇到"\n"时任将其保存到s中,自动在s的最后加"\0"。
当读入过程中遇到EOF或发生错误,函数返回NULL指针时,此时可以用 feof() 和 ferror() 来判断函数是遇到EOF还是发生错误。
常见用法:
1.常见的fgets的几种写法:
首先,我们准备好一个2.txt的文件,内容如下:
然后,我们看看如下3种常见写法:
①
-
#include <stdio.h>
-
-
int main()
-
{
-
char line[256] = {0};
-
FILE *fd = fopen("2.txt", "r");
-
-
if(!fd)
-
{
-
printf("fopen fail\n");
-
return -1;
-
}
-
-
while(!feof(fd))
-
{
-
fgets(line, sizeof(line), fd);
-
printf("%s", line);
-
}
-
fclose(fd);
-
return 0;
-
}
②
-
#include <stdio.h>
-
-
int main()
-
{
-
char line[256] = {0};
-
FILE *fd = fopen("2.txt", "r");
-
-
if(!fd)
-
{
-
printf("fopen fail\n");
-
return -1;
-
}
-
-
while(!feof(fd) && !ferror(fd))
-
{
-
fgets(line, sizeof(line), fd);
-
printf("%s", line);
-
}
-
fclose(fd);
-
return 0;
-
}
以上2种写法,每次输出时最后一行都重复输出,这是因为fgets读取完最后一行后立即正常结束读取,此种情况下未更新line内容导致。
③
-
#include <stdio.h>
-
-
int main()
-
{
-
char line[256] = {0};
-
FILE *fd = fopen("2.txt", "r");
-
-
if(!fd)
-
{
-
printf("fopen fail\n");
-
return -1;
-
}
-
-
while(fgets(line, sizeof(line), fd))
-
{
-
printf("%s", line);
-
}
-
fclose(fd);
-
return 0;
-
}
而
第3种写法,就是OK的。
参考:
fgets重复读取最后一行,都是feof惹的祸 文件流中读行的正确使用(fgets、feof、ferror)
2.常见的fgets用于匹配特定字符串的两种写法:
①fgets+strncmp
-
while(fgets(line, sizeof(line), fd) && strncmp(line, "abc", strlen("abc")) == 0)
-
{
-
...
-
}
②fgets+strstr
-
while(fgets(line, sizeof(line), fd) && strstr(line, "abc"))
-
{
-
...
-
}
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) |