一、前言
- 在前面一篇文章中我們介紹的函數以一次一個字符或一次一行的方式進行操作。如果進行二進制I/O操作,那麼我們更願意一次讀活蟹一個完整的結構。如果使用getc()或putc()讀、寫一個結構,那麼必須循環通過整個結構,每次循環處理一個字節,一次讀或寫一個字節,這會非常的麻煩。如果使用fputs()或fgets(),那麼因爲fputs()在遇到null字節時就停止,而在結構中可能含有null字節,所以不能使用它實現讀結構的要求;類似的,fgets()遇到null也會停止工作
- 因此提供了下面兩個函數以張藝興二進制I/O操作
二、fread()、fwrite()
fread()
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
- 功能:從stream流中讀取count次數據,每次讀取size個字節大小。然後寫入到buffer中
- 返回值:
- 讀取成功:返回實際讀取stream流的次數,而不是字節數
- 讀取失敗/達到文件尾:返回0
- 若stream或buffer爲空指針,或在unicode模式中寫入的字節數爲奇數,此函數設置errno爲EINVAL以及返回0
fwrite()
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
- 功能:從buffer中讀取count次,每次讀取size個字節,然後寫入到stream流中
- 返回值:
- 讀取成功:返回實際寫入stream流的次數,而不是字節數
//將一個結構體信息寫入到文件中,然後再文件中讀出來
#include<stdio.h>
#include<string.h>
typedef struct student
{
int age;
char name[20];
}stu;
int main()
{
stu Man={17,"xiaoming"};
stu Man2;
FILE *pf;
if(pf=fopen("Demo.txt","w+"))
{
fwrite(&Man,sizeof(stu),1,pf);
}
fclose(pf);
if(pf=fopen("Demo.txt","r"))
{
fread(&Man2,sizeof(stu),1,pf);
printf("Age:%d,Name:%s\n",Man2.age,Man2.name);
fclose(pf);
}
return 0;
}