fopen()函数的用法

函数功能:打开一个文件

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

相关函数:open,fclosefopen_s,_wfopen

fopen所需库:<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"等,读者注意所用系统的规定。

二进制和文本模式的区别

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

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

示例

程序示例1

#include <stdio.h>

#include //为了使用 exit()

int main()

{

char ch;

FILE* fp;

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

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

scanf("%s",fname);

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

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

{

printf("错误!");

exit(1); //中止程序

}

//getc()用于在打开文件中获取一个字符

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

putchar(ch);

fclose(fp); //关闭文件

return 0;

}

注意!初学者往往会犯一个错误,即在输入文件名时不加后缀名,请注意加上!

程序示例2

#include <stdio.h>

FILE *stream, *stream2;

int main( void )

{

int numclosed;

fopen// Open for read (will fail if file "crt_fopen.c" does not exist)

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

// Note: fopenis deprecated; consider usingfopen_sinstead

printf( "The file ‘crt_fopen.c‘ was notopened\n" );

else

printf( "The file ‘crt_fopen.c‘ wasopened\n" );

// Open for write

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

printf( "The file ‘data2‘ was not opened\n" );

else

printf( "The file ‘data2‘ was opened\n" );

// Close stream if it is not NULL

if( stream)

{

if (fclose( stream ) )

{

printf( "The file ‘crt_fopen.c‘ was not closed\n" );

}

}

// All other files are closed:

numclosed = _fcloseall( );

printf( "Number of files closed by _fcloseall: %u\n", numclosed );

}

<:SECTION>

2操作

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

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

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

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

示例程序:

#include <stdio.h>

#define F_PATH "d:\myfile\file.dat"

int main(void)

{

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

fp = fopen(F_PATH, "r");

if(NULL == fp)

{

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

}

fclose(fp);

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

return 0;

}

时间: 2024-10-17 15:51:54

fopen()函数的用法的相关文章

fopen和fopen_s用法的比较

fopen和fopen_s用法的比较 fopen 和 fopen_s           fopen用法: fp = fopen(filename,"w").         fopen_s用法:,须定义另外一个变量errno_t err,然后err = fopen_s(&fp,filename,"w").        返回值: fopen打开文件成功,返回文件指针(赋值给fp),打开失败则返回NULL值:                       fo

C语言中system()函数的用法总结(转)

system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: 1 #include <sys/types.h> 2 #include <sys/wait.h> 3 #include <errno.h> 4 #include <unistd.h> 5 6 int system(const char * cmdstring) 7 { 8 pid_t pid; 9 int status; 10 11 12 if(cmdstri

解析PHP中ob_start()函数的用法

解析PHP中ob_start()函数的用法 本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下 ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行/都会有"Header had all ready send by"的错误,这时可以先用ob_start()打开缓冲区PHP代码的数据块和echo()输出都会进入缓冲区而不会立刻输出.当然打开缓冲区的作用很 多,只要发挥你的想象.可以总结以下四点: 1.

(转)解析PHP中ob_start()函数的用法

本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下 ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行/都会有"Header had all ready send by"的错误,这时可以先用ob_start()打开缓冲区PHP代码的数据块和echo()输出都会进入缓冲区而不会立刻输出.当然打开缓冲区的作用很多,只要发挥你的想象.可以总结以下四点: 1.用于header()之前ob_start();

mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法

mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差.其结果的单位由interval 参数给出.interval 的法定值同TIMESTAMPADD()函数说明中所列出的相同. mysql> SELECT TIMESTAMPDIFF(MONTH,'200

【转】oracle的substr函数的用法

[转]oracle的substr函数的用法 oracle的substr函数的用法 取得字符串中指定起始位置和长度的字符串   substr( string, start_position, [ length ] ) 如:     substr('This is a test', 6, 2)     would return 'is'     substr('This is a test', 6)     would return 'is a test'     substr('TechOnThe

Oracle trunc()函数的用法

--Oracle trunc()函数的用法 /**************日期  TRUNC()函数没有秒的精确 ********************/ select sysdate from dual --当时日期 select trunc(sysdate) from dual select trunc(sysdate ,'DD') from dual --今天日期 select trunc(sysdate,'d')+7 from dual --本周星期日 select trunc(sys

C中的时间函数的用法

C中的时间函数的用法    这个类展示了C语言中的时间函数的常用的用法. 源代码: #include <ctime>#include <iostream> using namespace std; class MyTime{public:    MyTime() { mPTime = 0; mStLocalTime = 0; mStGMTTime = 0; }    ~MyTime() {}; //time_t time(time_t * timer) 返回自1970年1月1日00

嵌入式之---常用模板函数(用法说明函数、参数解析函数)

主要内容:嵌入式常用模板函数(用法说明函数.参数解析函数) /*显示参数列表*/ void usage() {     printf("usage: server [-p:x] [-i:IP] [-o]\n\n");     printf("       -p:x      Port number to listen on\n");     printf("       -i:str    Interface to listen on\n");

awk中split函数的用法

The awk function split(s,a,sep) splits a string s into an awk array a using the delimiter sep. time=12:34:56 echo $time | awk '{split($0,a,":" ); print a[1]}' 12   echo $time | awk '{split($0,a,":" ); print a[3]}' 34   echo $time | awk