二进制读写概念
文本文件和二进制的区别:
存储的格式不同:文本文件只能存储文本。
计算机内码概念:文本符号只在计算机内部的编码(计算机内部只能存储数字010101001.。。。,所以所有符号都要编码)
二进制读写函数格式
size_t fread(void *ptr, size_t, size_t n, FILE *fp);
(从FILE *fp中读取,size_t size大小,size_t n 个个数,的内容所读取内容在void *ptr中。(或void *ptr指向所读取的内容))
void *ptr ----- 读取内容放的位置指针;
size_t size ----- 读取的块大小;
size_t n ----- 读取的个数;
FILE *fp ----- 读取的文件指针;
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
void *ptr ----- 写文件的内容的位置指针;
size_t size ----- 写的块大小;
size_t n ----- 写的个数;
FILE *fp ----- 要写的文件指针;
注意事项:
文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。
解决办法:
1、移动指针(后续说);
2、关闭文件,再次打开文件;
二进制文件读写代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student{
char name[10];
int age;
char sex[8];
};
int main(int argc, const char *argv[])
{
FILE *fp;
size_t ret;
struct student stu;
struct student stu1;
struct student stu2;
fp = fopen("1.bin", "w");
if (fp == NULL) {
perror("fopen");
return 0;
}
strcpy(stu1.name, "zhangsan");
stu1.age = 21;
strcpy(stu1.sex, "male");
strcpy(stu2.name, "lisi");
stu2.age = 22;
strcpy(stu2.sex, "male");
ret = fwrite(&stu, sizeof(stu), 2, fp);
if (ret == -1) {
perror("ferite");
goto end;
}else{
printf("write struct student success\n");
}
fclose(fp);
fp = fopen("1.bin", "r");
if (fp == NULL) {
perror("fopen");
return 0;
}
ret = fread(&stu, sizeof(stu), 2, fp);
if (ret == -1) {
perror("fread");
goto end;
}else{
printf("name:%s age:%d sex:%s\n", stu1.name, stu1.age, stu1.sex);
printf("name:%s age:%d sex:%s\n", stu2.name, stu2.age, stu2.sex);
}
end:
fclose(fp);
}