linuxc编程 ——文件操作—— 部分函数

open()函数:

头文件:

 #include<fcntl.h>//在centos6.0中只要此头文件就可以
 #include<sys/types.h>
 #incldue<sys/stat.h>

功能:打开和创建文件(建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。)

函数原型:

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返回的文件描述符一定是最小的而且没有被使用的

close():

头文件:

#include<unistd.h>

功能:关闭一个已经打开的文件

原型:

int close(int fd)
参数说明:
 fd:是需要关闭的文件描述符

返回值:

成功:返回0;
失败:返回-1,并设置errno

打开的文件描述符一定要记得关闭,否则资源会被大量的占用,导致内存不够

实例:

打开的文件存在时:

#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
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<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
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;
}

write():

头文件:

#include <unistd.h>

原型:

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

参数说明:

  fd:是文件描述符(write所对应的是写,即就是1)
  buf:通常是一个字符串,需要写入的字符串
  count:是每次写入的字节数

返回值:

 成功:返回写入的字节数
 失败:返回-1并设置errno

ps: 写常规文件时,write的返回值通常等于请求写的字节
数count, 而向终端设备或者网络写时则不一定

read():

头文件:

#incldue <unistd.h>

功能:用于从文件描述符对应的文件读取数据(从打开的设备或文件中读取数据)

原型:

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

参数说明:

fd:      是文件描述符
buf:     为读出数据的缓冲区;
count:   为每次读取的字节数(是请求读取的字节数,读上来的数据保
         存在缓冲区buf中,同时文件的当前读写位置向后移)

返回值:

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

代码:

#include<stdio.h>
#include<string.h>
#include<unistd.h>
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会更好。

lseek()

头文件:

#include<sys/types.h>
#incldue <unstd.h>

函数原型:

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会存放错误代码。

文件描述符的重定向:dup/dup2

函数原型:

#incldue <unistd.h>
int dup (int oldfd)
int dup2(int oldfd,int newfd)

说明:


dup/dup2:进行文件描述符的重定向即创建一个oldfd的副本。 
dup:最低编号、未被使用的文件描述符是oldfd的一份拷贝。 
dup2:newfd是oldfd的一份拷贝。 

返回值:

返回值:成功(newfd); 失败(-1)。 

实例:

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
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");

}

UNIX/Linux系统下stat/fstat/lstat函数

函数原型:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
int main(int argc,char *argv[])
{
        struct stat buf;//存放属性
	if(argc!=2)//参数个数
	{
		printf("usage:my_stat <filename>\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);
}

博主资历尚浅,有什么不对的地方,还望斧正。
今天先写到这儿,明天继续写剩下的函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值