C语言文件与目录(二)

文件的打开指的是从磁盘中找到一个文件,返回一个整型的打开文件顺序编号。打开的文件处于可读可写状态。文件的关闭指的是释放打开的文件,使文件处于不可读写的状态。 

打开文件函数open:函数open的作用是打开一个文件,使文件处于可读写的状态。这个函数的使用方法如下所示。

int open(char *pathname, int flags);

int open(char *pathname,int flags, mode_t mode);

文件打开方式的设置:在上一小节所示函数的参数列表中,pathname表示要打开文件的路径字符串。参数flags是系统定义的一些整型常数,表示文件的打开方式。Flags的可选值如下所示。

O_RDONLY:以只读方式打开文件。
O_WRONLY:以只写方式打开文件。
O_RDWR:以可读写方式打开文件。

上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用“|”运算符组合。

O_CREAT:若要打开的文件不存在则自动建立该文件。
O_EXCL:如果O_CREAT 已被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置时,如果要打开的文件为一个链接,则会打开失败。
O_NOCTTY:如果要打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
O_TRUNC:若文件存在并且以可写的方式打开时,此标志会清空文件。这样原来的文件内容会丢失。
O_APPEND:以附加的文件打开文件。当读写文件时会从文件尾开始向前移动,写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK:以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即结束文件的打开。
O_NDELAY:O_NONBLOCK。
O_SYNC:以同步的方式打开文件,所有的文件操作不写入到缓存。
O_NOFOLLOW:如果参数pathname 所指的文件为一符号连接,则会打开失败。
O_DIRECTORY:如果参数pathname 所指的文件的目录不存在,则打开文件失败。

打开文件的权限:打开文件时,如果没有这个文件则会自动新建一个文件。在新建文件时需要设置新建文件权限。系统为参数mode定义了下面这些常数,可以直接使用这些常数来设置文件的权限。这些权限设置只有在建立新文件时才会有效。 
S_IRWXU:00700权限,该文件所有者具有可读可写可执行的权限。
S_IRUSR或S_IREAD:00400权限,该文件所有者具有可读取的权限。
S_IWUSR或S_IWRITE:00200 权限,该文件所有者具有可写入的权限。
S_IXUSR或S_IEXEC:00100 权限,该文件所有者具有可执行的权限。
S_IRWXG:00070权限,该文件用户组具有可读可写及可执行的权限。
S_IRGRP:00040 权限,该文件用户组具有可读的权限。
S_IWGRP:00020权限,该文件用户组具有可写入的权限。
S_IXGRP:00010 权限,该文件用户组具有可执行的权限。
S_IRWXO:00007权限,其他用户具有可读可写可执行的权限。
S_IROTH:00004 权限,其他用户具有可读的权限。
S_IWOTH:00002权限,其他用户具有可写入的权限。
S_IXOTH:00001 权限,其他用户具有可执行的权限。

文件打开实例:本小节讲解一个文件打开实例,用open函数打开一个文件。调用这个函数时,如果正确的打开了这个文件,则返回这个文件的打开编号。如果打开失败则返回0。使用这个函数之前需要在程序的最前面包含下面这些头文件。
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
open函数可能发生下面这些错误。可用errno捕获打开文件时发生的错误。
EEXIST:参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。
EACCESS:参数pathname所指的文件没有打开权限。
EROFS:欲写入权限的文件存在于只读文件系统内。
EFAULT:参数pathname指针超出可存取内存空间。
EINVAL:参数mode不正确。
ENAMETOOLONG:参数pathname太长。
ENOTDIR:参数pathname不在一个目录中。
ENOMEM:核心内存不足。
ELOOP:参数pathname有过多符号连接问题。
EIO:I/O存取错误。

关闭文件函数close:函数close的作用是关闭一个已经打开的文件。使用完文件后需要则可使用close函数关闭该文件,这个操作会让数据写回磁盘,并释放该文件所占用的资源。该函数的使用方法如下所示。
int close(int fd);

参数fd是用open函数打开文件时返回的打开序号。如果成功关闭文件则返回0,发生错误则返回-1。在进程结束时,系统会自动关闭已打开的文件,但仍建议在程序中关闭文件,并检查返回值是否正确。在关闭文件时,可能返回EBADF错误,表示需要关闭的文件号不存在。在使用这个函数时,需要在程序的前面包含下面的头文件。

include<unistd.h>

DEMO:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
int fd_file;
char file[255]="";
strcat(strcpy(file,mainpath),"\\file.txt");
if((fd_file=open(file,O_RDONLY))==0)
{
	printf("%s\n",strerror(errno));
}
else
{
	close(fd_file);
}

文件读写:

文件读写指的是从文件中读写信息或将信息写入到文件中。文件读取是使用read函数来实现的。文件保存是通过write函数来实例的。在进行文件保存的操作时,只是在文件的缓冲区中操作,可能没有立即写入的到文件中。需要使用sync或fsync函数将缓冲区中的数据写入到文件中。

在文件中写字符串函数write:函数write可以把一个字符串写入到一个已经打开的文件中。这个函数的使用方法如下所示。

ssize_t write (int fd,void * buf,size_t count);

在参数列表中,fd是已经打开文件的文件号。buf是需要写入的字符串。count是一个整型数,表示需要写入的字符个数。size_t是一个相当于整型的数据类型,表示需要写入的字节的数目。将字符串写入文件以后,文件的读写位置也会随之移动。

如果写入成功,write函数会返回实际写入的字节数。发生错误发生时则返回-1,可以用errno来捕获发生的错误。可能发生的错误如下所示。
EINTR:此操作被其他操作中断。
EAGAIN: 当前打开文件是不可写的方式打开时,不能写入文件。
EADF:参数fd不是有效的文件编号,或该文件已关闭。

DEMO:

int fd_write;
char file_write[255]="";
strcat(strcpy(file_write,mainpath),"\\file_write.txt");
if((fd_write=open(file_write,O_WRONLY|O_CREAT|O_APPEND))!=0)
{
	char* write_str="I love biki!\n";
	write(fd_write,write_str,strlen(write_str));
	close(fd_write);
}

读取文件函数read:函数read可以从一个打开的文件中读取字符串。这个函数的使用方法如下所示。

ssize_t read(int fd,void *buf ,size_t count);

在参数列表中,fd表示已经打开文件的编号。buf是一个空指针,读取的内容会返回到这个指针指向的字符串。count表示需要读取字符的个数。返回值表示实例读取到的字符的个数。如果返回值为0,表示已经到达文件末尾或文件中没有内容供读取。在读文件时,文件的读写位置会随着读取到的字节移动。

当有错误发生时,返回值为-1,可以用errno来捕获错误编号。可能返回的错误编号如下所示。
EINTR:此操作被其他操作中断。
EAGAIN: 当前打开文件是不可写的方式打开时,不能写入文件。
EADF:参数fd不是有效的文件编号,或该文件已关闭。

DEMO:

int fd_file;
char file[255]="";
char file_buffer[1024];
strcat(strcpy(file,mainpath),"\\file.txt");
if((fd_file=open(file,O_RDONLY))==0)
{
	printf("%s\n",strerror(errno));
}
else
{
	read(fd_file,file_buffer,100);
	printf("%s\n",file_buffer);
	close(fd_file);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值