C语言文件那块的if((fp=fopen(filepath,"w"))==NULL)中为什么不用
1.if当中应该使用((fp=fopen(filepath,"w"))!=NULL),当返回的指针不等于NULL时,表示文件被正确打开。
2.fopen的函数原型:FILE * fopen(const char * path,const char * mode);
fopen函数的第一个参数是文件路径,第二个参数是打开方式,有以下几种方式:
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读数据。
rw+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
wt+ 读写打开或着建立一个文本文件;允许读写。
at+ 读写打开一个文本文件,允许读或在文本末追加数据。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
3.例程:
#include<stdio.h>
#define F_PATH "d:\\myfile\\file.dat"
int main(){
FILE*fp=NULL;//需要注意
fp=fopen(F_PATH,"r");
if(NULL==fp)
{
return -1;//要返回错误代码
}
fclose(fp);
fp=NULL;//需要指向空,否则会指向原打开文件地址
return 0;
}
其次,fp是通过“FILE *fp;”语句声明的,可见fp为文件指针类型,而fopen函数的返回值也为文件指针类型,所以左值使用fp而非*fp。这个情景类似于返回int类型的函数需要使用一个int类型的变量来接收其返回值一个道理。
最后,谢谢,积分呀。嘻嘻
变量声明 是 FILE *fp;
fopen() 函数,返回值 是 FILE 型 指针。
所以 语句里这样赋地址值: fp=fopen(filepath,"w")
赋值后,FILE 型 指针 fp 若等于 NULL,就表示 赋值失败,文件打开失败。
---
为什么不用*fp=。 因为 fopen() 函数,返回值 是 FILE 型 地址,不是数值。
==============
如果在声明里写:
FILE *fp=fopen(filepath,"w"); 这是允许的。因为是声明,这里外形是*fp, 实际上是地址。
然后 语句里:
if (!fp) { printf("open error !\n"); return 0;};
摘取devc++中stdio.h中的FILE文件结构体的定义 来分析一下
/*
* The structure underlying the FILE type.
*
* Some believe that nobody in their right mind should make use of the
* internals of this structure. Provided by Pedro A. Aranda Gutiirrez
* <paag@tid.es>.
*/
#ifndef _FILE_DEFINED
#define_FILE_DEFINED
typedef struct _iobuf
{
char*_ptr;
int_cnt;
char*_base;
int_flag;
int_file;
int_charbuf;
int_bufsiz;
char*_tmpfname;
} FILE;
#endif/* Not _FILE_DEFINED */
fopen等函数的原型声明
/*
* File Operations
*/
_CRTIMP FILE* __cdecl fopen (const char*, const char*);
_CRTIMP FILE* __cdecl freopen (const char*, const char*, FILE*);
_CRTIMP int __cdeclfflush (FILE*);
_CRTIMP int __cdeclfclose (FILE*);
至于_CRTIMP、__cdecl是干什么的 我们不管
fopen的返回值类型是 FILE* 即指向结构体的指针类型
所以定义 FILE *p; 以后 可以用指针变量p接收 fopen函数返回值的赋值
p是指向某个FILE结构体类型变量的指针变量,*p是p指向的某个FILE类型的变量
至于这个“某个FILE结构体类型变量”
,怎么来的, 我们不用管 ,因为操作系统会管 轮不到我们来管