fopen函数简介

函数简介

函数功能:打开一个文件

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

相关函数:openfclosefopen_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字符,如rbw+bab+等组合,加入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"等,读者注意所用系统的规定。

二进制和文本模式的区别

1.windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n"

2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。

打开方式总结:各种打开方式主要有三个方面的区别:

①打开是否为二进制文件,用“b”标识。

②读写的方式,有以下几种:只读、只写、读写、追加只写、追加读写这几种方式。

③对文件是否必须存在、以及存在时是清空还是追加会有不同的响应。具体判断如下图。

9c16fdfaaf51f3deea1fbd2a96eef01f3b2979ca.jpg



程序示例

示例一

#include<stdio.h>

 

#defineF_PATH"d:\\myfile\\file.dat"

intmain(void)

{

FILE*fp=NULL;//需要注意

fp=fopen(F_PATH,"r");

if(NULL==fp)

{

return-1;//要返回错误代码

}

fclose(fp);

fp=NULL;//需要指向空,否则会指向原打开文件地址

return0;

}

示例二

#include<stdio.h>

#include<stdlib.h>//为了使用exit()

intmain()

{

charch;

FILE*fp=NULL;

charfname[50];//用于存放文件名

printf("输入文件名:");

scanf("%s",fname);

fp=fopen(fname,"r");//只供读取

if(fp==NULL)//如果失败了

{

printf("错误!");

exit(1);//中止程序

}

while((ch=getc(fp))!=EOF)

putchar(ch);

fclose(fp);//关闭文件

return0;

}

注意!初学者往往会犯一个错误,即在输入文件名时不加后缀名,请注意加上!(为什么文件一定要有后缀名?)

示例三[2]

#include<stdio.h>

 

FILE*stream,*stream2;

 

intmain(void)

{

intnumclosed;

//Openforread(willfailiffile"crt_fopen.c"doesnotexist)

if((stream=fopen("crt_fopen.c","r"))==NULL)//C4996

//Note:fopenisdeprecated;considerusingfopen_sinstead

printf("Thefile'crt_fopen.c'wasnotopened\n");

else

printf("Thefile'crt_fopen.c'wasopened\n");

//Openforwrite

if((stream2=fopen("data2","w+"))==NULL)//C4996

printf("Thefile'data2'wasnotopened\n");

else

printf("Thefile'data2'wasopened\n");

//ClosestreamifitisnotNULL

if(stream)

{

if(fclose(stream))

{

printf("Thefile'crt_fopen.c'wasnotclosed\n");

}

}

//Allotherfilesareclosed:

numclosed=_fcloseall();

printf("Numberoffilesclosedby_fcloseall:%u\n",numclosed);

}


注意

在文件操作时,需要注意以下几点问题

1、在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL;

2、文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。

3、文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦;如:fp = NULL;



二进制文件


广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。文本文件是一种由很多行字符构成的计算机文件。文本文件存在于计算机系统中,通常在文本文件最后一行放置文件结束标志。文本文件的编码基于字符定长,译码相对要容易一些;二进制文件编码是变长的,灵活利用率要高,而译码要难一些,不同的二进制文件译码方式是不同的。

从本质上来说他们之间没有什么区别,因为他们在硬盘上都有一种的存放方式--二进制,但是如果要对他们有些区分的话,那可以这样理解。每个字符由一个或多个字节组成,每个字节都是用的-128—127之间的部分数值来表示的,也就是说,-128——127之间还有一些数据没有对应任何字符的任何字节。如果一个文件中的每个字节的内容都是可以表示成字符的数据,我们就可以称这个文件为文本文件,可见,文本文件只是二进制文件中的一种特例,为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,由于很难严格区分文本文件和二进制文件的概念,所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,没有包含字符以外的其他数据,我们就称之为文本文件,除此之外的文件就是二进制文件。

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

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

相关文章

【kali】kali换了root权限后无法打开firefox浏览器

从普通权限换成root权限后发现火狐进不去鸟&#xff01;&#xff01; 终端报错&#xff1a; Running firefox as root in a regular user’s sessin is not supported.($HOME is /home/miehahaha which is owned by uid 1000) 分析&#xff1a; 是的&#xff0c;原来普通权限m…

【win10】局域网内两台win10共享文件夹

https://jingyan.baidu.com/article/93f9803f3e9788e0e46f55c8.html

CentOS 7关闭firewalld启用iptables

在CentOS7中&#xff0c;有很多CentOS 6中的常用服务发生了变化。 其中iptables是其中比较大的一个。防火墙iptables被firewalld取代。 本文将介绍&#xff0c;如果采用systemctl关闭firewalld&#xff0c;开启iptables。 1.关闭firewalld [roothwcentos70-01 system]# systemc…

wpa_supplicant wifi密码错误检测

system("/usr/sbin/wpa_supplicant -Dnl80211 -iwlan0 -f /tmp/wpa_log -c/tmp/wpa_supplicant.conf -d -t -B &"); 在/tmp/wpa_log中查看是否有如下的字符串&#xff1a; 1. 针对WPA&#xff0f;WPA2加密方式 //1473218403.305655: wlan0: WPA: 4-Way Handsh…

CentOS 7 安装nginx

1.安装pcre pcre-devel yum install pcre pcre-devel -y rpm -qa pcre pcre-devel 2.安装openssl-devel yum install -y openssl-devel rpm -qa openssl-devel openssl 3.下载nginx cd /home/testuser/mkdir toolscd tools/wget -q http://nginx.org/download/nginx-1.9.9.…

MPEG4与.mp4

流媒体应用中TS和MP4格式分析应该是封包格式。不能简单理解成MPEG4的简称。要详细解释这个问题&#xff0c;需要提一下MPEG4和.mp4在概念上的区别。 一般来说&#xff0c;仅提“MPEG4”&#xff0c;是指一种视频压缩算法。可以把原始画面通过数学运算变换成一组二进制数据&…

MP4文件格式的解析,以及MP4文件的分割算法

mp4应该算是一种比较复杂的媒体格式了&#xff0c;起源于QuickTime。以前研究的时候就花了一番的功夫&#xff0c;尤其是如何把它完美的融入到视频点播应用中&#xff0c;更是费尽了心思&#xff0c;主要问题是处理mp4文件庞大的“媒体头”。当然&#xff0c;流媒体点播也可以采…

MP4文件格式详解

一、基本概念 1.mp4概述 MP4文件中的所有数据都装在box&#xff08;QuickTime中为atom&#xff09;中&#xff0c;也就是说MP4文件由若干个box组成&#xff0c;每个box有类型和长度&#xff0c;可以将box理解为一个数据对象块。box中可以包含另一个box&#xff0c;这种box称为c…

H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

SkySeraph Apr 1st 2012 Email&#xff1a;skyseraph00163.com 一、MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二、MP4封装格式核心概念 1 MP4封装格式对应标准为 ISO/IEC 14496-12&#xff08;信息技术 视听对象编码的第12部分: ISO 基本媒体文件格式/Info…

AAC音频格式分析

关于AAC音频格式基本情况&#xff0c;可参考维基百科http://en.wikipedia.org/wiki/Advanced_Audio_Coding AAC音频格式分析 AAC音频格式有ADIF和ADTS&#xff1a; ADIF&#xff1a;Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数…

tar压缩隐藏文件

如果想tar 压缩包含隐藏文件的目录&#xff0c;同时排除掉部分无用的目录 tar -czvf 20161009.tar.gz * .[!.]* --exclude .git 在Linux下打包tar文件时添加密码的方法 在当前目录下有一个pma目录的文件夹: 1、使用tar对文件压缩加密&#xff1a; 代码如下: # tar -zcvf - pma…

linux 怎么把^M去掉

在linux下&#xff0c;不可避免的会用VIM打开一些windows下编辑过的文本文件。我们会发现文件的每行结尾都会有一个^M符号&#xff0c;这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致&#xff0c; 对于回车符的定义&#xff1a; windows&#xff1a;0D0A un…

关于cp命令中拷贝所有的写法

今天在编写一个脚本的时候&#xff0c;发现一个比较奇怪的问题&#xff1a;就是在使用cp拷贝当前目录下所有文件到目标目录的时候&#xff0c;源和目标大大不同。原来一直没有留意有这样的问题&#xff0c;后来查了些资料&#xff0c;才知道以前一直使用的格式有误&#xff0c;…

cp -r 和 cp -R 的区别

今天倒腾linux根文件系统的时候发现 cp -r /dev /dev_bak 时&#xff0c;竟然会 将磁盘设备中的数据进行一次拷贝&#xff0c;而不是仅仅建立设备文件。于是到网上搜了一把&#xff0c;收获不小。http://www.loveunix.net/html/200407/33920.html这里有人问同样的问题&#xff…

Makefile选项CFLAGS,LDFLAGS,LIBS

CFLAGS 表示用于 C 编译器的选项&#xff0c; CXXFLAGS 表示用于 C 编译器的选项。 这两个变量实际上涵盖了编译和汇编两个步骤。 CFLAGS&#xff1a; 指定头文件&#xff08;.h文件&#xff09;的路径&#xff0c;如&#xff1a;CFLAGS-I/usr/include -I/path/include。同样地…

smbclient和挂载samba共享目录

1&#xff0c;列出某个IP地址所提供的共享文件夹 smbclient -L 198.168.0.1 -U marsaber%12332112345672,像FTP客户端一样使用smbclient smbclient //192.168.0.1/tmp -U marsaber%1233211234567 执行smbclient命令成功后&#xff0c;进入smbclient环境&#xff0c;出现提示符…

linux 下source命令

当我修改了/etc/profile文件&#xff0c;我想让它立刻生效&#xff0c;而不用重新登录&#xff1b;这时就想到用 source 命令&#xff0c;如:source /etc/profile对source进行了 学习 &#xff0c;并且用它与sh 执行脚本进行了对比&#xff0c;现在总结一下。source命令&#x…

make Image uImage与zImage的区别

内核编译&#xff08;make&#xff09;之后会生成两个文件&#xff0c;一个Image&#xff0c;一个zImage&#xff0c;其中Image为内核映像文件&#xff0c;而zImage为内核的一种映像压缩文件&#xff0c;Image大约为4M&#xff0c;而zImage不到2M。 那么uImage又是什么的&#…

ubuntu下tftp的安装、配置、使用

1. 安装$ apt-get install tftp-hpa tftpd-hpa2. 建立目录$ mkdir /tftpboot # 这是建立tftp传输目录。$ sudo chmod 0777 /tftpboot$ sudo touch test.txt # test.txt文件最好输入内容以便区分3. 配置$ sudo vi /etc/default/tftpd-hpa# /etc/default/tftpd-hpaTFTP_USERNAME&…

ubuntu下搭建nfs服务器

1.1 搭建NFS服务器 NFS&#xff08;Network FileSystem&#xff0c;网络文件系统&#xff09;是由SUN公司发展&#xff0c;并于1984年推出的技术&#xff0c;用于在不同机器&#xff0c;不同操作系统之间通过网络互相分享各自的文件。NFS设计之初就是为了在不同的系统间使…