fopen、fwrite使用

函数fopen

1.函数简介

函数功能:打开一个文件

函数原型:FILE * fopen(const char * path,const char * mode);

相关函数:open,fclose,fopen_s[1],_wfopen

所需库:   <stdio.h>

返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。

一般而言,打开文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。


参数说明:

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读数据。
rw+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
at+ 打开一个叫string的文件,a表示append,就是说写入处理的时候是接着原来文件已有内容写入,不是从头写入覆盖掉,t表示打开文件的类型是文本文件,+号表示对文件既可以读也可以写。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。
有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。

函数fwrite

功能
  C语言函数,向文件写入一个数据块  。
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入的数据块数目
(1)buffer:是一个指针,对fwrite来说,是要输出数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。
说明:写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大。
fseek对此函数有作用,但是fwrite[1]函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步。
关于fwrite 第3个参数count解释:

fwrite(const void*buffer,size_t size,size_t count,FILE*stream);

可以这样理解,将缓冲区buffer的内容写入stream指向的文件的
共写count组数据,每组数据有size个字节,

如果有一个结构体
struct AAA
{
char a;
int b;
long c;
float d
};
struct AAA x,y[20];
那么写这个数据到文件就是:
fwrite(x,sizeof(AAA),1,fp);
fwrite(y,sizeof(AAA),20,fp);
当然,因为地址是连续的,你也可以
fwrite(y,sizeof(AAA)*20,1,fp);或者
fwrite(y,1,sizeof(AAA)*20,fp);
但这样很别扭
而且第二个参数size的大小是有限制的,
所以最好是用
fwrite(y,sizeof(AAA),20,fp);
来得可靠,安全,方便,清楚

示例测试:


[cpp] view plaincopy
print?
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. #define FILENAME ("/home/snail/work_dir/linux_c_work/file.bin")  
  5. #define BUF ("Hello world!\n")  
  6.   
  7. int main()  
  8. {  
  9.     FILE *fp = NULL;  
  10.     int write_length = 0;  
  11.     fp = fopen(FILENAME, "ab+");  
  12.     if(fp == NULL)  
  13.     {  
  14.         return 0;  
  15.     }  
  16.     write_length = fwrite(BUF, 1, strlen(BUF), fp);  
  17.     printf("write_length = %d\n", write_length);  
  18.     fclose(fp);  
  19.     fp = NULL;  
  20.     return 0;     
  21. }  



在文件操作时,需要注意以下几点问题
1、在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL;
2、文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。
3、文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦;如:fp = NULL;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派安装CentOS

1.下载并安装&#xff0c;这里使用的是 centos系统地址:http://mirror.centos.org/altarch/7/isos/armhfp/ 下载CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1804-sda.raw.xz解压并烧录到TF卡 默认用户名root密码centos 2.连接wifi nmcli d nmcli d wifi  #查看周围的…

android studio导入eclipse项目各种问题,Android | 导入Eclipse项目到Android studio的问题解决全过程...

D老师今天给了一个Android项目&#xff0c;但是他当时(2015年)用的是eclipse写的而我用的是Android studio&#xff0c;所以在导入项目的过程中出现了一些常见的问题&#xff0c;在这里总结一下解决的问题的过程。1.eclipse项目导入到Android studio的过程&#xff1a;File->…

《WEB应用测试》笔记(六)

《WEB应用测试》笔记&#xff08;六&#xff09;第三章 软件测试基础 18、软件开发阶段的常见范例&#xff08;1&#xff09;a版&#xff1a;产品主要的和达成共识的部分已经完成。产品准备投入内部使用。&#xff08;2&#xff09;B前期版本&#xff1a;提交进行B验收的构造版…

蜡烛节能车模

❝简 介&#xff1a; 本文给出了几款使用蜡烛驱动的车模。关键词&#xff1a; 蜡烛&#xff0c;车模01 蜡烛车模1.1 蜡烛光电池点上蜡烛就能跑&#xff0c;DIY制作玩具汽车小模型The Energy of the Candle. Car Model[4]▲ 图1.2 蜡烛驱动的智能车模▲ 图1.1.3 光电池车模▲ …

Xen Desktop测试报告

Xen Desktop测试报告 &#xff08;九叔最近写的一个测试报告&#xff0c;仅供参考&#xff0c;可能结论不适合你们公司&#xff09; 目的 测试目的&#xff1a;本次测试周期耗时两周&#xff08;2011.11.14-2011.11.24&#xff09;&#xff0c;主要为了理解思杰的桌面虚拟化&am…

Linux基础提高_系统性能相关命令

w 看系统的负载信息 用于显示已经登陆系统的用户列表&#xff0c;并显示用户正在执行的指令 uptime [rootlocalhost]#uptime 17:26:07 up 9:02, 3 users, load average: 0.00, 0.00, 0.00 能够打印系统总共运行了多长时间和系统的平均负载。uptime命令可以显示的信息显示依次为…

去广州见了我大学老师标哥

标哥是我的大学老师。标哥也是我们很多学生公认上课非常好的老师&#xff0c;最近标哥突然想见见我这个年轻仔&#xff0c;让我去广州见见他&#xff0c;当然&#xff0c;并不是说他不能来深圳&#xff0c;见面的时候标哥特意给我们解释了一遍&#xff0c;我肯定是能理解他的良…

fseek和ftell

fseek函数是 用来设定文件的当前读写位置. 函数原型: int fseek(FILE *fp,long offset,int origin); 函数功能:把fp的文件读写位置指针移到指定的位置. fseek(fp,20,SEEK_SET); 意思是把fp文件读写位置指针从文件开始后移20个字节. ftell函数是用来获取文件的当前读写位置…

Java与.Net 在RSA加密方面能不能互相通讯操作???

最近接触了一个案例. 如下:系统A: Java平台, 对信息进行RSA加密. 注意: 是用私钥加密.系统B: .Net平台, 要对信息进行RSA解密证书: 中Java中提供的工具Keytool.exe生成.为了证明解决方案的可行性.我做了以下测试:1>. RSA私钥加密,公钥是否可解(Java代码测试)结果: 可解. (…

本地html页面传递表单值,js实现两个页面表单传值并接收

js 实现两个页面表单传值并接收源码A页面&#xff1a;functiontest(){var s document.getElementById("txt");location.href"2.html?""txt"encodeURI(s.value);}第一个页面表单中输入文字或其他值。B页面代码&#xff1a;var loclocation.href;…

[SCOI2009]最长距离

Description windy有一块矩形土地&#xff0c;被分为 NM 块 11 的小格子。 有的格子含有障碍物。 如果从格子A可以走到格子B&#xff0c;那么两个格子的距离就为两个格子中心的欧几里德距离。 如果从格子A不可以走到格子B&#xff0c;就没有距离。 如果格子X和格子Y有公共边&am…

维修点滴:键盘进杂物

还是那台使用USB口连接打印机的计算机&#xff0c;出现故障。 故障现象是&#xff1a;鼠标放在有上下左右的文件或者栏目上&#xff0c;就上下左右的乱串——怪不得叫鼠标&#xff0c;呵呵。 我刚开始以为是电脑中病毒了&#xff0c;就重做系统&#xff08;也顺便安装了打印机驱…

说好的薪资统计

本来是不想把最后的统计发出来的&#xff0c;但是后台很多同学都想看看嵌入式的薪资&#xff0c;我自己也答应了会发出来&#xff0c;所以趁着这个假期再发一次&#xff0c;也让大家做个参考。不想发的原因是因为担心有别有用心的人拿这个薪资来做比较&#xff0c;多少会让大家…

STL面试题

http://blog.csdn.NET/tianya_team/article/details/50753759 1.说说std::vector的底层&#xff08;存储&#xff09;机制。 vector就是一个动态数组&#xff0c;里面有一个指针指向一片连续的内存空间&#xff0c;当空间不够装下数据时&#xff0c;会自动申请另一片更大的空间…

实现IButtonControl接口时, PerformClick()方法的代码怎么写,请高手指导!

在做WinForm时&#xff0c;想做一个像Asp.Net里的ImageButton的控件&#xff0c;于是自己写了一个自定义控件&#xff0c;名为&#xff1a;ImageButton&#xff0c;继承PictureBox类&#xff0c;并实现IButtonControl接口&#xff0c;但是实现IButtonControl接口时必须重写IBut…

html5 网络断开,html5 – websocket不断断开连接

我一直在努力建立一个在浏览器中运行的websocket聊天室.我已经做了一些谷歌搜索,并找到了一个提供示例websocket连接的网站(www.websocket.org/echo.html).但每当我尝试“连接”按钮时,它会立即显示“已断开连接”,并且我无法发送消息(这只发生在Chrome上).所以我在Firefox上尝…

各种仓储模式的学习

1. 仓储类和仓储接口 https://www.cnblogs.com/caofangsheng/p/5801926.html 2. 泛型仓储类和 工作单元 https://www.cnblogs.com/caofangsheng/p/5804057.html 3. 简单的泛型仓储接口和泛型仓储类 https://www.jianshu.com/p/89b51753b2cf转载于:https://www.cnblogs.com/bi…

【转载】 Asp.net Mvc 3当然也不会例

最快的学习方法&#xff1a;找到官方的教程&#xff0c;最好是类似Msdn演练或者冠以Step By Step的&#xff0c;跟着做一遍&#xff0c;做的过程中可以拷贝少量教程中的代码&#xff0c;确保每个步骤、每行代码含义都能够明白&#xff0c;中途随手记录一下&#xff0c;每个步骤…

什么是BSP工程师?

文章转自https://luomuxiaoxiao.com/?p170一、嵌入式系统要明白什么是嵌入式软件工程师&#xff0c;我们先从嵌入式系统&#xff08;嵌入式设备&#xff09;说起。维基百科上对嵌入式系统的定义如下&#xff1a;嵌入式系统&#xff08;Embedded System&#xff09;&#xff0c…

《STL源码剖析》相关面试题总结

一、STL简介 STL提供六大组件&#xff0c;彼此可以组合套用&#xff1a; 容器 容器就是各种数据结构&#xff0c;我就不多说&#xff0c;看看下面这张图回忆一下就好了&#xff0c;从实现角度看&#xff0c;STL容器是一种class template。 算法 各种常见算法&#xff0c;如sor…