C函数篇(fopen函数)

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

相关函数:openfclosefopen_s,_wfopen

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

函数简介

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

返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回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"等,读者注意所用系统的规定。

二进制和文本模式的区别

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

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

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

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

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

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

程序示例

示例一

#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;

}

示例三

#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);

}

时间: 2024-11-08 23:32:35

C函数篇(fopen函数)的相关文章

函数篇之——函数也是数据

1.  对于JavaScript 来说,有一个概念十分重要——既函数是一种数据类型. 也就是说,下面两种函数定义在本质上是相同的: ① . function f () { return 1; } ② . var f = function () { return 1; } 其中,第二种定义方式通常被叫做函数标识记法(function literal notation). 如果我们对函数变量调用typeof,操作符返回的字符串将会是“function”. >>> var f = functi

C函数篇(Timer函数)

语法 Timer() 语法Timer ( interval {, windowname } ) 参数 指定两次触发Timer事件之间的时间间隔,有效值在0到65之间.如果该参数的值指定为0,那么关闭定时器, 不再触发指定窗口的Timer事件.windowname:窗口名,指定时间间隔到时要触发哪个窗口的Timer事件.省略该参数时,触发当前窗口的 Timer事件返回值Integer.函数执行成功时返回1,发生错误时返回-1.如果任何参数的值为NULL,Timer()函数返回NULL.用法使 用T

C函数篇(setsockopt函数②)

套接口选项 在前面的几章中,我们讨论了使用套接口的基础内容.现在我们要来探讨一些可用的其他的特征.在我们掌握了这一章的概念之后,我们就为后面的套接口的高级主题做好了准备.在这一章,我们将会专注于下列主题: 如何使用getsockopt(2)函数获得套接口选项值 如何使用setsockopt(2)函数设置套接口选项值 如何使用这些常用的套接口选项 得到套接口选项 有时,一个程序需要确定为当前为一个套接口进行哪些选项设置.这对于一个子程序库函数尤其如此,因为这个库函数并不知道为这个套接口进行哪些设置

SQl Server 函数篇 数学函数,字符串函数,转换函数,时间日期函数

数据库中的函数和c#中的函数很相似 按顺序来, 这里价格特别的 print  可以再消息栏里打印东西 数学函数 ceiling()  取上限   不在乎小数点后面有多大,直接忽略 floor()     取下限   同上 round(列名,保留的位数)   四舍五入   保留小数最后那位数进不进一只看保留位数的后一位数够不够条件,再往后的就不管了 ABS()     绝对值---防抱死233 PI()        圆周率   就是查询一个圆周率 SQRT()平方根 字符串函数 upper()

C函数篇(wait函数)

#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status) 进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经 退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回:如果没有找到这样一个子进程,wait就 会一直阻塞在这里,直到有一个出现为止. 参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型

C函数篇(socket函数)

简述 创建一个套接口. #include <winsock.h> SOCKET PASCAL FAR socket( int af, int type, int protocol); af:一个地址描述.目前仅支持AF_INET格式,也就是说ARPA Internet地址格式. type:新套接口的类型描述. protocol:套接口所用的协议.如调用者不想指定,可用0指定,表示缺省. 注释       socket()函数用于根据指定的地址族.数据类型和协议来分配一个套接口的描述字及其所用的

C函数篇(select函数)

Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等 待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回).可是使用Select就可以完成非阻塞(所谓非阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回

C函数篇(fork函数)

一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子: /* *  fork_test.c *  version 1

C函数篇(send函数)

send()用于向一个已经连接的socket发送数据,如果无错误,返回值为所发送数据的总数,否则返回SOCKET_ERROR. 简述 向一个已连接的套接口发送数据. #include <winsock.h> int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags); s:一个用于标识已连接套接口的描述字. buf:包含待发送数据的缓冲区. len:缓冲区中数据的长度. flags:调用执行方式. 注释 sen