版权声明:本文为小斑马伟原创文章,转载请注明出处!
一、文件块写文件
size_t fwrite(const void ptr,size_t size , size_t nmemb, FILE * stream);
功能: 以数据块的方式给文件写入内容
参数: ptr: 准备写入文件数据的地址 size: size_t 为unsigned int 类型,此参数指定写入文件内容的块数据大小 nmemb: 写入文件的块数,写入文件数据总大小为: sizenmemb .stream: 已经打开的文件指针
返回值:成功:实际成功写入文件数据的块数目,此值和nmemb相等 失败 0
文件打开模式
第二个参数的几种形式(打开文件的方式):
打开模式 | 含义 |
---|---|
r或rb | 以只读方式打开一个文本文件(不创建文件,若文件不存在则报错) |
w或wb | 以写方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件) |
a或ab | 以追加方式打开文件,在末尾添加内容,若文件不存在则创建文件 |
r+或rb+ | 以可读、可写的方式打开文件(不创建新文件) |
w+或wb+ | 以可读、可写的方式打开文件(如果文件存在则清空文件,文件不存在则创建一个新文件 |
a+或ab+ | 以添加方式打开文件,打开文件并在末尾更改文件,若文件不存在则创建文件 |
注意:
- b是二进制模式的意思,b只是在Windows有效,在Linus用r和rb的结果一样的。
- Unix和Linux下所有的文件文件行都是\n结果,而Windows所有的文本文件行都是\r\n结尾
- 在Windows平台下,以“文本”方式打开文件,不加b:
- 1 当读取文件的时候,系统会将所有的"\r\n"转换成"\n"
- 2 当写入文件的时候,系统会将"\n"转换为"\r\n"写入
- 3 以“二进制”方式打开文件,则读\n写都不会进行这样的转换
- 在Unix/Linux平台下,“文本”与“二进制”模式没有区别,“\r\n"作为两个字符原样输入输出
二、文件块读写整型数据到文件
int main() {
FILE* fp = fopen("D:/c.txt", "wb");
if (!fp)
return -1;
int a = 55678;
fwrite(&a, sizeof(int), 1, fp);
fclose(fp);
return 1;
}
int main(void) {
FILE* fp = fopen("D:/c.txt", "rb");
if (!fp)
return -1;
int value;
fread(&value, sizeof(int), 1, fp);
printf("%d\n", value);
return 0;
三、文件块读写数组数据到文件
int main() {
FILE* fp = fopen("D:/c.txt", "rb");
if (!fp)
return -1;
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
fwrite(arr, sizeof(int), 10, fp);
fclose(fp);
return 0;
}
//读出数组
int main() {
FILE* fp = fopen("D:/c.txt", "rb");
if (!fp)
return -1;
int arr[] = { 0 };
fread(arr, sizeof(int), 10, fp);
for (int i = 0; i < 10; i++) {
printf("%d\n", arr[i]);
}
fclose(fp);
return 0;
}
四、文件块读写结构体到文件
struct student
{
char name[21];
int age;
int score;
char addr[51];
}stu;
//写入
int main(){
stu ss[3] = {
{ "阿道夫", 9, 10, "北京" };
{"松岛枫", 3, 1000, "南京"};
{"陈胜", 43, 1, "大同"};
}
FILE* fp = fopen("D:/c.txt", "rb");
if (!fp)
return -1;
for (int i = 0; i < 3; i++) {
fwrite(&ss[i], sizeof(stu), 1, fp);
}
fclose(fp);
system("pause");
return 0;
}
//读出
int main(void) {
FILE* fp = fopen("D:/c.txt", "rb");
if (!fp)
return -1;
stu* ss = (stu*)malloc(sizeof(stu)* 3);
int i = 0;
while (!feof(fp)) {
fread(&ss[i], sizeof(stu), 1, fp);
i++;
}
for (int i = 0; i < 3; i++) {
printf("姓名:%s\n", ss[i].name)
printf("年龄:%d\n", ss[i].age);
printf("成绩:%d\n", ss[i].score);
printf("地址:%s\n", ss[i].addr);
}
free(ss);
fclose(fp);
return 0;
}