头文件:
#include//在centos6.0中只要此头文件就可以
#include
#incldue
功能:打开和创建文件(建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。)
函数原型:
int open(const char*pathname,int flags);
int open(const char*pathname,int flags,mode_t mode);
参数说明:
1.pathname
要打开或创建的目标文件
2.flags
打开文件时,可以传入多个参数选项,用下面的
一个或者多个常量进行“或”运算,构成falgs
常用参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR: 读,写打开
这三个常量,==必须制定一个且只能指定一个==
O_CREAT: 若文件不存在,则创建它,需要使
用mode选项。来指明新文件的访问权限
O_APPEND: 追加写,如果文件已经有内容,这次打开文件 所写的数据附加到文件的末尾而不覆盖原来的内容
ps: open函数具体使用那个,和具体应用场景相关,如目标文件存在,使用两个参数的open,如果目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限
返回值:
成功:新打开的文件描述符
失败:-1
open返回的文件描述符一定是最小的而且没有被使用的
头文件:
#include
功能:关闭一个已经打开的文件
原型:
int close(int fd)
参数说明:
fd:是需要关闭的文件描述符
返回值:
成功:返回0;
失败:返回-1,并设置errno
打开的文件描述符一定要记得关闭,否则资源会被大量的占用,导致内存不够
实例:
打开的文件存在时:
#include
#include
#include
#include
#include
int main()
{
int fd=open("myfile",O_WRONLY);
if(fd<0)
{
perror("open");
exit(1);
}
const char*msg="hello open\n";
int count = 6;
while(count--)
{
write(fd,msg,strlen(msg));
}
close(fd);
return 0;
}
打开的文件不存在时:
#include
#include
#include
#include
#include
int main()
{
int fd=open("file",O_WRONLY|O_CREAT,0644);
//file文件不存在,所以在书写第二个参数时,记得把O_CREAT加上,
//如果不加O_CREAT的话,程序就会报此文件不存在
if(fd<0)
{
perror("open");
exit(1);
}
const char*msg="hello file\n";
int count=10;
while(count--)
{
write(fd,msg,strlen(msg));
}
close(fd);
return 0;
}
头文件:
#include
原型:
ssize_t write(int fd,const void*buf,size_t count);
参数说明:
fd:是文件描述符(write所对应的是写,即就是1)
buf:通常是一个字符串,需要写入的字符串
count:是每次写入的字节数
返回值:
成功:返回写入的字节数
失败:返回-1并设置errno
ps: 写常规文件时,write的返回值通常等于请求写的字节
数count, 而向终端设备或者网络写时则不一定
头文件:
#incldue
功能:用于从文件描述符对应的文件读取数据(从打开的设备或文件中读取数据)
原型:
ssize_t read(int fd,void*buf,size_t count)
参数说明:
fd: 是文件描述符
buf: 为读出数据的缓冲区;
count: 为每次读取的字节数(是请求读取的字节数,读上来的数据保
存在缓冲区buf中,同时文件的当前读写位置向后移)
返回值:
成功:返回读出的字节数
失败:返回-1,并设置errno,如果在调用read
之前到达文件末尾,则这次read返回0
代码:
#include
#include
#include
int main()
{
const char*msg="hello\n";
int len = strlen(msg);
write(1,msg,len);//write所对应的文件描述符为1
char buf[1024]={0};
read(0,buf,len);//read所对应的文件描述符为0
return 0;
}
fread函数read函数的区别:
1.fread函数是封装好的库函数,而read函数是系统函数,一般来说,fread效率更高;
2.读取文件的差别:fread函数功能更强大,可以读取结构体的二进制文件,但是如果是最底层的操作,用到文件描述符的话,用read会更好。
头文件:
#include
#incldue
函数原型:
off_t lseek(int fildes, off_t offset, int whence)
参数fildes offset:
参数fildes为已打开的文件描述词
参数offset为根据参数whence来移动读写位置的位移数。
参数whence为下列其中一种:
SEEK_SET 参数offset即为新的读写位置
SEEK_CUR 当前读写位置后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量
当whence值为SEEK_CUR或SEEK_END时,参数offset允许负值的出现
函数说明:
每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则会读写位置会指向文件尾。当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes为已打开的文件描述词,参数offset为根据参数whence来移动读写位置的位移数。
下列是较特别的使用方式:
(1)欲将读写位置移到文件开头时:lseek(int fildes, 0, SEEK_SET)
(2)欲将读写位置移到文件尾时时:lseek(int fildes, 0, SEEK_END)
(3)欲将取得目前文件位置时:lseek(int fildes, 0, SEEK_CUR)
返回值:
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字符。若有错误则返回-1, errno会存放错误代码。
函数原型:
#incldue
int dup (int oldfd)
int dup2(int oldfd,int newfd)
说明:
dup/dup2:进行文件描述符的重定向即创建一个oldfd的副本。
dup:最低编号、未被使用的文件描述符是oldfd的一份拷贝。
dup2:newfd是oldfd的一份拷贝。
返回值:
返回值:成功(newfd); 失败(-1)。
实例:
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
int fd1=open(argv[1],O_RDWR);
int fd2=open(argv[2],O_RDWR);
int fdret=dup2(fd1,fd2);//返回新文件描述符,使得fd2也指向fd1.
printf("fdret=%d\n",fdret);
int ret=write(fd2,"1234567",7);//实际写入到了fd1指向的文件
printf("ret=%d",ret);
dup2(fd1,STDOUT_FILENO);//将屏幕输入重定向到fd1
printf("----------------------------5678");
}
函数原型:
#include
#include
#include
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
三个函数的返回值:
若成功则返回0,若出错则返回-1
介绍:
stat函数根据pathname路径返回与此命名文件有关的信息结构
fstat根据文件描述符获取有关信息结构
lstat类似于stat,但是当命名文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用的文件信息
存放属性的结构体(struct stat *buf):
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
实例:
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
struct stat buf;//存放属性
if(argc!=2)//参数个数
{
printf("usage:my_stat \n");
exit(0);
}
if(stat(argv[1],&buf)==-1)
{
perror("stat:");
exit(1);
}
printf("device : %d\n",buf.st_dev);
printf("inode : %d\n",buf.st_ino);
printf("mode : %o\n",buf.st_mode);
}
博主资历尚浅,有什么不对的地方,还望斧正。
今天先写到这儿,明天继续写剩下的函数