fwrite / fread 函数说明及使用,一次读写一块字节【C】(zd)

fwrite / fread 函数说明及使用,一次读写一块字节

fwrite / fread 函数

C 语言己经从接口的层面区分了,文本的读写方式和二进制的读写方式。
对于文本文件来说:

所有的文件接口函数,要么以 ‘\0’,表示输入结束,要么以 ‘\n’, EOF(0xFF)表示 读取结束。 ‘\0’ ‘\n’ 等都是文本文件的重要标识。
而二进制文件,则往往以块的形式写入或读出。
而所有的二进制接口对于这些标识,是不敏感的。
在这里插入图片描述

试读文本文件

我们给出代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
    char buf[1024] = { "abcde\0fghij" };
    FILE* pfa = fopen("xx.txt", "w+");
    fputs(buf,pfa);
    fclose(pfa);
    FILE* pfb = fopen("yy.txt", "wb");
fwrite((void *)buf,1,11,pfb);
fclose(pfb);
    return 0;
}

执行结果为:
在这里插入图片描述

我们可以看到xx里面只能写道\0就会结束,但是yy里面会把所有的数据写入。

我们用UE打开两个文件进行查看:
在这里插入图片描述
在这里插入图片描述

通过查看两个文件内容的16进制形式我们也可以看到xx和yy里面所写入的内容。

当然除了写入\0写入\n也是没有任何问题的:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
    char buf[1024] = { "abc\ndef\nghij" };
    FILE* pfa = fopen("xx.txt", "w+");
    fputs(buf,pfa);
    fclose(pfa);
    FILE* pfb = fopen("yy.txt", "wb");
fwrite((void *)buf,1,11,pfb);
fclose(pfb);
    return 0;
}

执行结果为:
在这里插入图片描述

我们可以看到两个文件都写入成功。

但是我们在读取的时候就不一样二进制方式和文本方式就不一样了。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
    char buf[1024] = { "abc\ndef\nghij" };
    FILE* pfa = fopen("xx.txt", "w+");
    fputs(buf,pfa);
    char readArr[1024] = {0};
    rewind(pfa);
    fgets(readArr, 1024, pfa);
    printf("%s",readArr);
    fclose(pfa);


    FILE* pfb = fopen("yy.txt", "wb+");
    fwrite((char *)buf,1,12,pfb);
    rewind(pfb);
    fread((char *)readArr, 1, 12, pfb);
    for (int i = 0; i < 12; i++)
    {
        printf("%x->%c\n", readArr[i],readArr[i]);
    }
    fclose(pfb);
    return 0;
}

我们直接打印了读取到的数据,执行结果为:
在这里插入图片描述

我们可以看到使用fgets函数读取到的只有abc后面遇到\n读取到\n之后会自动加上\0然后结束。从结果为我们也可以看出来xx.txt文件读取到了\n打印结果abc后面出现了换行。
最重要的是,fgets 只能读取到一部分,但是fread函数可以到所有数据。

我们再说明一种情况:

#include<stdio.h>

int main()
{
    FILE* pf = fopen("cc.txt","w+");
    int arr[10] = {0,1,0xffffffff,0,1,2,3,4,5};
    fputs((char *)arr,pf);
    fclose(pf);
    return 0;
}


我们直接给出说明,上面这种方式无法将数据写入文件,因为arr[0]的四个字节都是0,fputs在遇到0的时候直接结束。fputs是写入文本的,arr数组是数值。
在这里插入图片描述

我们可以看到cc的大小为0字节。

我们使用二进制写入方式:

#include<stdio.h>
int main()
{
    int arr[10] = { 0,1,0xffffffff,0,1,2,3,4,5 };
    FILE* pfb = fopen("gg.txt", "wb+");
    fwrite((void*)arr, 4, 10, pfb);
     fclose(pfb);
return 0;
}

执行结果为:
在这里插入图片描述

我们可以看到打开为乱码。

以二进制形式写入在读取的时候也要以二进制形式读取:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>


int main()
{
    int arr[10] = { 0,1,0xffffffff,0,1,2,3,4,5 };
    FILE* pfb = fopen("gg.txt", "wb+");
    fwrite((void*)arr, 4, 10, pfb);
    rewind(pfb);
    int arrCpy[10];
    fread((int *)arrCpy,4,10,pfb);
    for (int i = 0; i < 10; i++)
    {
        printf("%d\n",arrCpy[i]);
    }
     fclose(pfb);
    return 0;
}

执行结果为:

在这里插入图片描述

小结

在这里插入图片描述

发布了84 篇原创文章 · 获赞 71 · 访问量 9103

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104187708