文件IO的函数

一.文件IO (不带缓存)----文件标识符(整数)//系统调用

1.打开–open

  • #include<fcntl.h>

  • int open(const char *pathname,int flags); n

  • int open(const char *pathname,int flags,mode_mode);

  • 功能:打开或创建文件

  • 参数:

    @pathname //打开的文件

    @flags //操作的标志

    ​ O_RDONLY //只读

    ​ O_WRONLY //只写

    ​ O_RDWR //读写

    ​ O_APPEND //追加

    ​ O_CREAT //文件不存在,创建

    ​ O_TRUNC //文件存在 截短为0

    @mode 一般不用,当flags中使用了O_CREAT,需要指定mode

    ​ mode 0777

    ​ 0666

    ​ 0444

    //实现touch功能
    #include<stdio.h>
    #include<fcntl.h>
    
    int main(int argc, const char *argv[])
    {
    	if(argc != 2)
    	{
    		printf("Usage: %s <filename>\n",argv[0]);
    		return -1;
    	}
    	int fd = open(argv[1],O_WRONLY | O_CREAT | O_TRUNC,0777);
    
    	if(fd < 0)
    	{
    		perror("open fail");
    		return -1;
    	}
    	return 0;
    }
    
    
    -rwxrwxr-x 1 linux linux    0 215 09:57 2.txt
    

    实际的文件不是0777,而是0775

    文件创建好后的权限

    • 制定的mode
    • umask = 0002(掩码) //二进制 —遮住
    • 最终文件的权限 = ~umask & mode
    • 一般给mode权限一般是0666
  • 返回值:成功 :文件描述符

    ​ 失败 : -1 && errno会被设置

  • 与fopen的区别

    fopen—open

    r --------- O_RDONLY

    r±--------O_RDWR

    w--------- O_WRONLY | O_CREAT | O_TRUNC

    w±-------O_RDWR | O_CREAT | O_TRUNC

    a--------- O_WRONLY | O_APPEND | O_CREAT

    a±-------O_RDWR | O_APPEND | O_CREAT

2.读写–read/write

#include<unistd.h>
ssize_t read(int fd,      void *buf, size_t count);
ssize_t write(int fd,const void *buf, size_t count);
  • read

  • 功能:从fd中读数据,存在buf中

  • 参数:@fd 要读取的文件

    ​ @buf 存放读取到的数据的内存空间

    ​ @count 一次要读取的数量 (字节)

  • 返回值:成功 表示成功读到的字节数

    失败 -1 && errno

    • 读取结束: 0
    #include<stdio.h>
    #include<unistd.h>
    
    int main(int argc, const char *argv[])
    {
    	char buf[1024] = {0};
    	while(1)
    	{
    		int ret = read(0,buf,100);
    		buf[ret-1] = '\0';
    		printf("ret = %d buf = %s\n",ret,buf);
    	}
    	
    	return 0;
    }
    
    
  • write

  • 功能:把buf写到fd中

  • 参数:1.@fd 要写入的文件

    ​ 2.@buf 存放数据的 内存空间

    ​ 3.@count 一次要写入的数量(字节)

  • 返回值:成功 表示成功写入的字节数

    ​ 失败 -1 && errno

    //实现cat
    #include<stdio.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main(int argc, const char *argv[])
    {
    	if(argc != 2)
    	{
    		printf("usage: %s <filename>\n",argv[0]);
    		return -1;
    	}
    	int fd = open(argv[1],O_RDONLY);
    
    	if(fd < 0)
    	{
    		perror("open fail");
    		return -1;
    	}
    	ssize_t ret = 0;
        char buf[1024] = {0};
    	while((ret = read(fd,buf,sizeof(buf)-1)) != 0)
    	{
    	//	buf[ret] = '\0';
    	//	printf("%s",buf);
    		write(1,buf,ret);
    	}
    
    	 close( fd);
    	
    	return 0;
    }
    
    
    //实现cp
    #include<stdio.h>
    #include<fcntl.h>
    #include<unistd.h>
    
    int main(int argc, const char *argv[])
    {
    	if(argc != 3)
    	{
    		printf("usage: %s <filename>\n",argv[0]);
    		return -1;
    	}
    	int fd1 = open(argv[1],O_RDONLY);
    	int fd2 = open(argv[2],O_WRONLY | O_CREAT,0777);
    
    	if((fd1 ||fd2)  < 0)
    	{
    		perror("open fail");
    		return -1;
    	}
    	ssize_t ret = 0;
        char buf[1024] = {0};
    	while(1)
    	{
    		ret = read(fd1,buf,sizeof(buf)-1);
    		if(ret == 0)
    			break;
    		write(fd2,buf,ret);
    	}
    
    	 close( fd1);
    	 close( fd2);
    	
    	return 0;
    }
    
    

3.关闭–close

  • #include<unistd.h>

  • int close (int fd)

  • 功能:关闭文件描述符,以便再次使用

  • 参数:@fd 要关闭的文件描述符

  • 返回:成功 0

    ​ 是被 -1

  • 文件描述符:1.非负整型的数值

    ​ 2.分配原则:最小未使用

    ​ 3. 0~1023

4.定位–lseek

  • off_t lseek(int fd,off_t offest,int whence).

    功能:重新定位文件偏移量。

    参数

    • @fd:要定位的文件描述符。
    • @offset:偏移量。
    • @whence:参考点。

    参考点选项

    • SEEK_SET:相对于文件开头。
      • offset >= 0
    • SEEK_CUR:相对于当前位置。
      • offset >= 0offset < 0(不能超过文件开头)。
    • SEEK_END:相对于文件末尾。
      • offset < 0(不能超过文件开头)。
      • offset >= 0(可以创建空洞文件)。

    返回值

    • 成功:返回从文件开头的偏移量。

    • 失败:返回 -1,并设置 errno

    • lssek(fd,0,SEEK_SET)

    • lssek(fd,0,SEEK_END)

    • 获得文件长度 :off_t len = lseek(fd,0,SEEK END)

      //获得空洞文件
      #include<stdio.h>
      #include<fcntl.h>
      #include<unistd.h>
      
      int main(int argc, const char *argv[])
      {
      	if(argc != 2)
      	{
      		printf("Usage: %s <filename>\n",argv[0]);
      		return -1;
      	}
      	int fd = open(argv[1],O_RDONLY);
      
      	if(fd < 0)
      	{
      		perror("open fail");
      		return -1;
      	}
      
      	off_t len = lseek(fd,0,SEEK_END);
      
      	int fd_d = open("hollo.txt",O_WRONLY | O_CREAT,0666);
      	if(fd < 0)
      	{
      		perror("open fail");
      		return -1;
      	}
      
      	lseek(fd_d,len-1,SEEK_END);
      	write(fd_d,"",1);
      
      	close(fd);
      	close(fd_d);
      
      	return 0;
      }
      
      

    5.标准IO操作 – 系统调用的函数

    1.fdopen

    • 将fd转换为FILE*

    • FILE *fdopen(int fd, const char *mode);

    • 返回值:成功 :FILE *

      ​ 失败: NULL;

    2.fileno

    • 将FILE * 转换为fd

    • int fileno(FILE *stream)

    • 成功 :fd

    • 失败 : - && errno

    • int feof (FILE *stream);
      int ferror(FILE *stream);

3.opendir/readdir/closedir函数

  • DIR *opendir(const char *name);
    功能:打开目录,关联一个目录流
    参数:@name 要打开的目录名
    返回值:
    成功 返回DIR *
    失败 NULL & errno

    #include <stdio.h>
    #include <dirent.h>
    
    int main(int argc, const char *argv[])
    {
    	DIR * dir = opendir(argv[1]);
    
    	if (dir == NULL)
    	{
    		perror("opendir fail");
    		return -1;
    	}
    
    	printf("success\n");
    
    	return 0;
    }
    
    
  • struct dirent *readdir(DIR *dirp);
    功能:读取目录项
    参数:@dirp 目录流指针
    返回值:
    成功 struct dirent *
    失败 NULL && errno

    #include <stdio.h>
    #include <dirent.h>
    
    int main(int argc, const char *argv[])
    {
    	DIR * dir = opendir(argv[1]);
    
    	if (dir == NULL)
    	{
    		perror("opendir fail");
    		return -1;
    	}
    
    	printf("success\n");
    
    
    	struct dirent *pdir = readdir(dir);
    
    	printf("ino = %ld\n",pdir->d_ino);
    	printf("type = %d\n",pdir->d_type);
    	printf("name = %s\n",pdir->d_name);
    
    
    	closedir(dir);
    	closedir(dir);
    
    	return 0;
    }
    
    
    struct dirent
    {
        ino_t d_ino;
        off_t d_off;
        unsigned short d_reclen;//Length of this record
        unsigned char d_type;//Type of file
        char d_name[256];//Null-terminated filename
    }
    
  • int closedir(DIR *dirp);
    功能:关闭目录流
    参数:@dirp — 目录流指针
    返回值:
    成功 0
    失败 -1 &&errno

//实现ls功能
#include <stdio.h>
#include <dirent.h>

int main(int argc, const char *argv[])
{
	if (argc != 2)
	{
		printf("Usage: %s <dirname>\n",argv[0]);
		return -1;
	}

	DIR * dir = opendir(argv[1]);

	if (dir == NULL)
	{
		perror("opendir fail");
		return -1;
	}

	struct dirent *pdir = NULL;
	while (1)
	{
		pdir = readdir(dir);
		
		if (pdir == NULL)
			break;
		if(pdir->d_name[0] != '.')	
			printf("%s  ",pdir->d_name);
	}
	putchar('\n');

	closedir(dir);

	return 0;
}

//实现统计目录下,普通文件和目录文件的个数
	while (1)
	{
		pdir = readdir(dir);

		if (pdir == NULL)
			break;

		if (pdir->d_type == DT_REG)
		{
			cnt_r ++;
		}else if (pdir->d_type == DT_DIR) 
		{
			cnt_d ++;
		}



4.chdir/getcwd

  • int chdir(const char *path);// /home/linux
    功能:改变当前程序的工作路径
    参数:path:改变到的路径
    返回值:
    成功 返回0
    失败 返回-1

  • char *getcwd(char *buf, size_t size);
    功能:获得当前的工作路径
    参数:buf:保存工作路径空间的首地址
    size:保存路径空间的长度
    返回值:
    成功返回包含路径空间的字符串首地址
    失败返回NULL

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
char buf[1024];

getcwd(buf,sizeof(buf));

printf("cwd = %s\n",buf);

chdir("/home");

getcwd(buf,sizeof(buf));

printf("cwd = %s\n",buf);

return 0;

}
//运行结果
cwd = /home/linux/04-dir
cwd = /home

```

5.mkdir/rmdir

  • int mkdir(const char *pathname, mode_t mode);//777 666 --x–x–x
    功能:创建一个目录
    参数:pathname:路径
    mode:
    mode & ~umask 0002
    返回值:
    成功 返回0
    失败 返回-1
  • int rmdir(const char *pathname);
    功能:删除一个空目录文件
    参数:pathname:目录文件的名字
    返回值:
    成功 返回0
    失败 返回-1
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, const char *argv[])
{

	if (mkdir(argv[1],0777) < 0)
	{
		perror("mkdir fail");
		return -1;
	}

	
	return 0;
}

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{

	if (rmdir(argv[1]) < 0)
	{
		perror("rmdir fail");
		return -1;
	}

	
	return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值