如题所说,这篇博文就来聊聊文件的写入,也就是将数据从程序中保存至指定文件当中。
在上一篇博文中,我们讨论并尝试了文件的读取操作,以及改变文件操作指针位置的操作,并运用了实例以及一个小小的面试题,佐证和练习了一下相关函数接口的用法,同时也留了一个小作业,不知道有没有小童鞋完成呢 =_=
手把手教会你C语言文件操作(1)
手把手教会你C语言文件操作(2)
文件操作相关函数
好吧,我也知道没啥人看我的写的博客,就不自取其辱了,直接进入正题吧。
1. 关于写入操作时的操作权限问题
首先要明确一下这个操作权限指的是什么。它是指我们用 fopen 打开某个文件时所指定的第二参数。
关于这个第二参数在讲 fopen 时并没有多说,只是简单地指定了一个只读权限,当然,在没有涉及到文件写入的操作时,这个只读权限完全足够,但到了就要注意一下了。
打开方式 | 说明 |
---|---|
“r” | 以“只读”方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。 |
“w” | 以“写入”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。 |
“a” | 以“追加”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。 |
“r+” | 以“读写”方式打开文件。既可以读取也可以写入,也就是随意更新文件。文件必须存在,否则打开失败。 |
“w+” | 以“写入/更新”方式打开文件,相当于w和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。 |
“a+” | 以“追加/更新”方式打开文件,相当于a和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。 |
“t” | 文本文件。如果不写,默认为"t"。 |
“b” | 以二进制方式打开文件,可以与上面的权限组合,如 rb 等。 |
上面的权限及说明要牢记哟,记不住的话也要知道在哪里能够找到它们哦。
还有就是,没有直接能够插入数据的权限!!!
这么说可能不好理解,举个例子吧:
比如我有一个字符串:abcdefg
我想要在 c 后面插入 12 这个数字,我们想要的结果是这样的:
abc12defg
可事实上我们如果先偏移文件操作指针至 c 之后再写入内容,得到的将会是:abc12fg
也就是说它是把原来那个位置上的内容给覆盖掉了。
如果还执有疑惑的童鞋不要急,敢于质疑是一个好习惯,不过我们先来看看写入函数并掌握它的用法,再来验证一番。
2. 文件写入函数 fwrite
函数原型:
size_t fwrite(void *ptr, size_t size, size_t count, FILE *fp);
数据来源 每一块多大 一共多少块 写到哪儿
@ptr: 临时存放要写入的内容的缓冲区
@size: 每次读取的数据块的大小
@count: 一共读取多少块数据
返回值:成功写入的数据块块数( 0 <= 返回值 <= count )。
这个函数与 fread 函数参数基本一致,不做过多介绍,简单说明一下第一参数,一般是一个缓冲区,但他最好是有内容的,然后要注意这个缓冲区一般都是以字符串形式存在,要注意你所写的内容是否需要字符串结束符 \0 。
然后就是写入时选择的权限问题,要考虑一下,若是文件存在,我是想要清空里面的内容呢,还是只是想要追加在原有文件之后?
若是不想清空,就用 r+ : 这个就是在原有基础上覆盖,在什么位置写入多少,这个文件就改变多少。
若是不想清空,也不想修改原有数据,只是追加就用 a 或 a+ 。
若是清空则用 w 或 w+ 。
举个例子,顺便验证一下在 1 中所提到的问题:
要写入的目标文件 a.txt 初始内容。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
const char *fileName = "C:\\Users\\Administrator\\Desktop\\a.txt";
// 打开文件
FILE *fp = fopen(fileName, "r+");
if(fp == NULL) printf("open error\n");
int ret;
char buf[5] = "12"; // 要写入的内容
// 文件操作位置偏移至 c 之后
ret = fseek(fp, 3, SEEK_SET);
if(ret == -1) printf("fseek error\n");
// 将数据写入文件
ret = fwrite(buf, 2, 1, fp);
if(ret <= 0) printf("fwrite error\n");
fclose(fp);
return 0;
}
执行完毕之后:
这样同样也佐证了我上面所说 **没有直接插入操作的权限** 这一说法。
3. 按格式写入 fprintf
函数原型:
int fprintf(FILE *stream, const char *format, ...);
这个函数与我们之前说过的 fscanf 简直一毛一样,我就不再重复了,给个链接对比一下:
上实例:
还是刚刚的 a.txt ,我们写入一个学生的简单基本信息
zahngsan M 25 csdn
#include <stdio.h>
int main()
{
FILE *fp = fopen(fileName, "a+");
if(fp == NULL) qDebug() << "open error";
int ret;
char stu_name[] = "zhangsan";
char stu_sex[] = "M";
int stu_age = 25;
char stu_coll[] = "csdn";
// 按照数据类型,分别用不同格式写入,一条数据占一行,所以带上了换行符 \n
ret = fprintf(fp, "%s %s %d %s\n", stu_name, stu_sex, stu_age, stu_coll);
if(ret <=0 )
{
printf("fprinf error\n");
}
fclose(fp);
return 0;
}
运行结果:
4. 总结
好啦,到这里文件操作就介绍完了,可能有同学会说我写的太少了,拢共也就不超过 10 个函数就说讲完了,别人都讲了好多呢。
确实,剩下的函数,我并没有说不要学,只是我觉得有这些就足够你完成想要完成基本的文件操作了,若是想要深入研究,可以先将我没有讲到的函数尝试一遍,掌握用法,再去深入了解。
基础已经讲完,至于你能将他们玩的多花里胡哨就看个人本事啦。
那么,手把手教会你C语言文件操作系列到此结束啦,如果对您有帮助,可以再评论区留下你的足迹,谢谢各位啦~