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;
}
执行结果为: