手把手教会你C语言文件操作(3)

本文详细介绍了C语言中文件写入操作的关键知识点,包括操作权限的选择、fwrite函数的使用实例、以及fprintf用于格式化写入的技巧。通过实例演示了如何正确处理文件写入权限问题,以及如何避免直接覆盖原有内容。
摘要由CSDN通过智能技术生成

如题所说,这篇博文就来聊聊文件的写入,也就是将数据从程序中保存至指定文件当中。

在上一篇博文中,我们讨论并尝试了文件的读取操作,以及改变文件操作指针位置的操作,并运用了实例以及一个小小的面试题,佐证和练习了一下相关函数接口的用法,同时也留了一个小作业,不知道有没有小童鞋完成呢 =_=

手把手教会你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 简直一毛一样,我就不再重复了,给个链接对比一下:

手把手教会你C语言文件操作

上实例:
还是刚刚的 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语言文件操作系列到此结束啦,如果对您有帮助,可以再评论区留下你的足迹,谢谢各位啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值