读取函数 fgetc和fgets的返回值

445 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

如何使用VS查看文本文件的二进制形式

1.在源文件新建项中添加现有项

image-20220310224716691


2.导入

image-20220310224727026



image-20220310224732276


image-20220310224744714


结果:

image-20220310224755798


image-20220310224801668

小端:低字节的内容放到低地址处

如果内存中以大端存储,那就以大端形式写到文本文件

小端也同理,不加任何转化,把数据存进去


12.读取函数返回值

fgetc - 每次读取一个字符

image-20220310224837123

返回值

image-20220310224854050

读取失败时,返回EOF

所以如果使用fgetc读取文件,可以判断fgetc是否为EOF来判定文件是否读取结束


假设现在文件中存放内容为:abcdef

int main()
{
    //打开文件
    FILE* pf = fopen("test.txt","r");
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    char ch = 0;
    //读文件
    //当遇到文件结束时,返回EOF跳出循环
    //注意优先级的问题!!!ch读取要用括号括起来
    while((ch = fgetc(pf)) != EOF)
    {
        printf("%c ",ch);
    }
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

执行结果:

image-20220310224901973


fgets -每次读取多个(最多读满一行)

image-20220310224923529


返回值

image-20220310224933563

如果成功读取,返回string的起始地址。如果读取失败,返回NULL

从流中读取n-1个信息然后末尾补上\0,放到string,然后返回string的起始地址

如果遇到错误/或者文件结束,返回NULL


例子

假设文件中存放内容为:

image-20220310224941941

int main()
{
    //打开文件
    FILE* pf = fopen("test.txt","r");
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
  char arr[20] = {0};//用来保存读取到的内容,空间要足够大(每一次读取都会覆盖上一次的内容)
    
    //读文件
    while(fgets(arr,20,pf)!=NULL)
    {
        printf("%s\n",arr);
    }
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

执行结果

image-20220310224955738

arr的内容每一次读取都会覆盖上一次的内容。

fgets的第二个参数n,如果n大于每一行的字符数,则读满这一行,并不会读取下一行


假设一次读取4个

int main()
{
    //打开文件
    FILE* pf = fopen("test.txt", "r");
    if (NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    char arr[20] = { 0 };//用来保存读取到的内容,空间要足够大(每一次读取都会覆盖上一次的内容)

      //读文件
    while (fgets(arr, 4, pf) != NULL)
    {
        printf("%s\n", arr);
    }
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

执行结果

image-20220310225010748

文件中每一行后面都换行了(\n),所以读取时会把\n也读取进去

一次读取4个字符,实际只读取3个,剩下一个位置放\0