fopen
函数原型: file*fopen(constchar*path,const char * mode );
相关函数: open,fclose,fopen_s,_wfopen
返回值:如果文件被成功打开,则会返回指向该流的文件指针。 如果文件打开失败,则返回NULL,并将错误代码存储在error中。
函数概述
函数原型: file*fopen(constchar*path,const char * mode );
返回值:如果文件被成功打开,则会返回指向该流的文件指针。 如果文件打开失败,则返回NULL,并将错误代码存储在error中。
一般来说,在打开文件后进行读取或写入文件的动作。 如果文件打开失败,下一个读写操作也将无法顺利进行,因此在fopen ()之后通常会做出错误的判断或处理。
参数说明:
参数path字符串包含要打开的文件的路径和文件名,参数mode字符串表示流的形式。
mode包含以下形式的字符串:
字符串说明r以只读方式打开文件。 此文件必须存在。 r用读取/写入打开文件。 此文件必须存在。 rb以读写方式打开二进制文件,只允许读写数据。 rt以读写方式打开文本文件,允许读写。 w打开只读文件,如果文件存在,当文件长度为零时,该文件的内容将消失; 如果文件不存在,请创建它。 w打开可读写文件,如果该文件存在,则文件的长度为零,并且该文件的内容将消失。 如果文件不存在,请创建它。 a用附加的方法只写入文件。 如果文件不存在,则会创建文件。 如果文件存在,则写入的数据将添加到文件的末尾。 这意味着将保留文件的原始内容(保留EOF符号)。 a打开时附加一个可读写的文件。 如果文件不存在,则会创建该文件。 如果文件存在,则写入的数据将添加到文件的末尾。 这意味着将保留文件的原始内容。 不保留EOF符号。 web以只读方式打开或新建二进制文件,只允许写入数据。 web以读写方式打开或创建新的二进制文件,以允许读写。 wt通过读取/写入打开或创建新的文本文件,以允许读取和写入。 at可以通过读取/写入打开文本文件,并在读取或文本的末尾添加数据。 ab可以通过读写打开二进制文件,并在读取或文件的末尾添加数据。 以x结尾的模式是独占模式,如果文件已经存在或无法创建,fopen通常会因路径不正确而失败。 文件以操作系统支持的独占模式打开。
可以在上述形态字符串中添加rb、w b、ab等组合的b字符。 添加b字符可以告诉库以二进制模式打开文件。 如果不加上b,则缺省情况下会加上t,即rt、wt。 其中t表示以文本模式打开文件。 在fopen ()中创建的新文件将被授予s _ IR usr|s _ iw usr|s _ IR grp|s _ iwg RP|s _ I Roth|s _ iwo th ) 0666 )权限
请注意,某些C编译系统可能无法完全提供这些功能,有些C版本可能是' rw '、" wr "、" ar "等,而不是' r '、" w "、" a "。
二进制和文本模式的区别
1、在Windows系统上,在文本模式下,文件用“rn”表示换行符。 在文本模式下打开文件并使用fputs等函数写入换行符“n”时,该函数会自动在“n”之前加上“r”。 这意味着实际写入文件的是“rn”。
2、在Unix/Linux类系统的文本模式下,文件用“n”表示换行符。 因此,在Linux系统上,文本模式和二进制模式是没有区别的。
打开方式总结:每种打开方式主要有三个区别
1、打开是否为二进制文件,用“b”表示。
2、读写方式有以下几种。 有只读、写入专用、读写专用、追加写入专用、追加读写方式。
3、根据文件是否必须存在,以及存在时是清空还是追加,反应不同。 具体判断如下图所示。
示例程序
样品1
#include stdio.h
# definef _ path“d :my filefile.dat”
入主(void ) )。
{
file FP=空; /需要注意/
FP=fopen(f_path,“r”);
if (空值==FP ) )。
{
返回- 1; /返回错误代码/
}
flose(FP );
fp=NULL; /必须指向空。 否则,它将指向原始打开的文件的地址/
返回0;
}
样品2
#include stdio.h
#includestdlib.h/exit (为了使用() ) /
入主(void ) )。
{
int i=0; 用于接收putchar getc数据*
char *ch=“”;
file FP=空;
char fname[50]; /用于存储文件名/
printf (“输入文件名:”
scanf('%s ',fname );
FP=fopen(fname,“r”); /只读/
if (空值=
= fp) / 如果失败了 /{
printf(“错误!”);
exit(1); / 中止程序 /
}
while ((ch[i] = getc(fp)) != EOF)
{
putchar(ch[i]);
i ++;
}
fclose(fp); / 关闭文件 /
fp = NULL; / 需要指向空,否则会指向原打开文件地址 */
return 0;
}
注意!初学者往往会犯一个错误,即在输入文件名时不加后缀名,请注意加上!
示例三
#include <stdio.h>
FILE *stream, *stream2;
int main(void)
{
int numclosed; /打开读取(如果文件“crt_fopen”将失败。c"不存在)/
if ((stream = fopen(“crt_fopen.c”, “r”)) == NULL) /* C4996 /
//注意:不推荐使用fopen;考虑使用fopen_s代替p
printf(“The file ‘crt_fopen.c’ was not openedn”);
else
printf(“The file ‘crt_fopen.c’ was openedn”); / Open for write /
if ((stream2 = fopen(“data2”, “w+”)) == NULL) / C4996 /
printf(“The file ‘data2’ was not openedn”);
else
printf(“The file ‘data2’ was openedn”);
/ Closes tream if it is not NULL /
if (stream)
{
if (fclose(stream))
{
printf(“The file ‘crt_fopen.c’ was not closedn”);
}
}
/ All other files are closed: */
numclosed = _fcloseall();
printf(“Number of files closed by _fcloseall: %un”, numclosed);
}
注意
在文件操作时,需要注意以下几点问题:
1、在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL;
2、在文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄漏和在下次访问文件时出现问题。
3、文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦;如:fp = NULL;