c语言文件操作函数的使用,c语言文件操作函数

1.创建文件

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

相关函数:open,fclose,fopen_s,_wfopen

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

一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。

参数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值。

二进制和文本模式的区别

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

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

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

注意

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

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

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

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

OPEN简述:

对于open函数来说,第三个参数仅当创建新文件时(即 使用了O_CREAT 时)才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的POSIX路径名(如/home/user/a.cpp);flags 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于fcntl.h)通过逻辑位或逻辑构成。

打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:

设置为非阻塞模式

以下三个常量同样是选用的,它们用于同步输入输出

open返回的文件描述符一定是最小的未被使用的描述符。 ---------------------------------------------------------我是分割线-----------------------------------------------------------------

原型  char *  fgets(char * s, int n,FILE *stream);

参数:

s: 字符型指针,指向存储读入数据的缓冲区的地址。

n: 从流中读入n-1个字符

stream : 指向读取的流。

返回值:

1. 当n<=0 时返回NULL,即空指针。

2. 当n=1 时,返回空串"".

3. 如果读入成功,则返回缓冲区的地址。

4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。

仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。

ssize_t read

int fd, void *buf, size_t count);

成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。

-----------------------------------------------------------我是分割线------------------------------------------

函数名: lseek

头文件:#include

#include

用 法: off_t lseek(int handle, off_t offset, int fromwhere); 注意:如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“

空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。

每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes 为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。

Offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。

whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2).

SEEK_SET 将读写位置指向文件头后再增加offset个位移量。

SEEK_CUR 以目前的读写位置往后增加offset个位移量。

SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。

下列是较特别的使用方式:

1) 欲将读写位置移到文件开头时:

lseek(int fildes,0,SEEK_SET);

2) 欲将读写位置移到文件尾时:

lseek(int fildes,0,SEEK_END);

3) 想要取得目前文件位置时:

lseek(int fildes,0,SEEK_CUR);

返回值

当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。

可能设置erron的错误代码:

EBADF: fildes不是一个打开的文件描述符。

ESPIPE:文件描述符被分配到一个管道、套接字或FIFO。

EINVAL:whence取值不当

实质:

Linux系统不允许lseek()对tty装置作用,此项动作会令lseek()返回ESPIPE。

SEEK_SET 等同于数字0 例如 :lseek(int fildes,0,SEEK_SET);=lseek(int fildes,0,0);

SEEK_CUR 等同于数字1 例如 :lseek(int fildes,0,SEEK_CUR);=lseek(int fildes,0,1);

SEEK_END 等同于数字2 例如 :lseek(int fildes,0,SEEK_END);=lseek(int fildes,0,2);

-------------------------------------------我是分割线------------------------------------------------------------

access,头文件是io.h,原型:

int   access(const   char   *filename,   int   amode);

amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1。

这个函数还可以检查其它文件属性: 06     检查读写权限

04     检查读权限

02     检查写权限

01     检查执行权限

00     检查文件的存在性

在UNIX和VC下实验成功。

好处是 fopen(..,"r")不好,当无读权限时一不行了。

而这个就算这个文件没有读权限,也可以判断这个文件存在于否

存在返回0,不存在返回-1

#include

int main()

{

printf ("%d",access("111",0));

--------------------------------------------------------------------------------------------

#include

#include

#include

void main( void )

{

/* Check for existence */

if( (_access( "ACCESS.C", 0 )) != -1 )

{

printf( "File ACCESS.C exists\n" );

/* Check for write permission */

if( (_access( "ACCESS.C", 2 )) != -1 )

printf( "File ACCESS.C has write permission\n" );

}

}

Output

File ACCESS.C exists

File ACCESS.C has write permission -----------------------------------------------------我是分割线-------------------------------------------------------

int remove(char * filename);

【参数】filename为要删除的文件名,可以为一目录。如果参数filename 为一文件,则调用unlink()处理;若参数filename 为一目录,则调用rmdir()来处理。

【返回值】成功则返回0,失败则返回-1,错误原因存于errno。

错误代码:

EROFS  欲写入的文件为只读文件。

EFAULT  参数filename 指针超出可存取内存空间。

ENAMETOOLONG  参数filename 太长。

ENOMEM  核心内存不足。

ELOOP  参数filename 有过多符号连接问题。

EIO I/O  存取错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值