当前位置: 首页 > article >正文

Linux下的文件IO之系统IO

1. 知识点

读入写出,切记以我们程序为中心向文件或者别的什么东西读入写出(输入流输出流)

人话就是

文件向我们程序就是读入

程序向文件或者别的什么就是写出

2. open打开文件

open.c

/*************************************************************************
    > File Name: open.c
    > Author: lsf
    > Mail: lsf_2012@163.com 
    > Created Time: 2023年10月20日 星期五 10时30分06秒
 ************************************************************************/

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

//使用open函数
int main()
{

    //打开文件---1.txt文件存在
    int fd1 = open("./1.txt",O_RDWR);

    //创建文件
    int fd2 = open("./2.txt",O_RDWR | O_CREAT,0777);

    printf("fd1 = %d   fd2 = %d\n",fd1,fd2);

    //关闭文件
    close(fd1);
    close(fd2);

    return 0;
}

3. read读入文件

read.c

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

//使用read函数
int main()
{

    //打开文件---1.txt文件存在
    int fd1 = open("./1.txt",O_RDWR);
    char buf[10]={0};

    //读文件
    while(1){
        
        memset(buf,0,sizeof(buf));//清空缓存区
        ssize_t ret = read(fd1,buf,sizeof(buf)-1);

        printf("%s",buf);

        if(ret==0){
            break;
        }

    }

    //关闭文件
    close(fd1);
    return 0;
}

3.2 实现cat函数

cat.c

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

//自己写一个cat函数

int main(int argc, char **argv)//cat.out   1.txt     2.txt  3.txt  4.txt
{                              //argv[0]  argv[1] argv[2]

	if(argc == 1)
	{
		printf("请给我至少一个文件的路径\n");
		return 0;
	}
	
	int i;
	for(i=1;i<argc;i++)
	{
		int fd1 = open(argv[i],O_RDWR);
		
		char buf[10] = {0};
	
		while(1)
		{
			memset(buf,0,sizeof(buf));//内存重置,清空bzero(buf,sizeof(buf));
			ssize_t n = read(fd1,buf,sizeof(buf)-1);
			
			printf("%s",buf);
			
			//退出条件
			if(n == 0)
			{
				close(fd1);
				break;
			}
			
			
		}
		
		
	}
}

4. write写出文件

write.c

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

//使用write函数实现文件的复制

int main()
{

    int fd1 = open("./1.txt",O_RDONLY);
    int fd2 = open("./2.txt",O_WRONLY|O_CREAT,0777);
    char buf[10];

    //文件的复制
    while(1){
        //内存清空
        memset(buf,0,sizeof(buf));
        //读文件
        ssize_t n = read(fd1,buf,sizeof(buf)-1);
        //写文件
        write(fd2,buf,strlen(buf));

        if(n==0){
            close(fd1);
            close(fd2);
            break;
        }

    }


    return 0;
}

5. lseek光标函数

lseek.c

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

//使用lseek函数

int main()
{

    int fd1 = open("./4.txt",O_RDWR|O_CREAT,0777);
    char buf[12] = "hello world";
    char buf2[12];

    //写文件
    write(fd1,buf,strlen(buf));
    lseek(fd1,0,SEEK_SET);//使光标复位到起始为止
    
    //读文件
    memset(buf2,0,sizeof(buf2));//清空缓存区
    read(fd1,buf2,sizeof(buf2));

    printf("%s\n",buf2);

    close(fd1);

    return 0;
}

6. perror错误打印函数

7. 练习

7.1 自我实现多个文件一起复制 copy函数

my_copy.c

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


//自我实现copy函数

int main(int argc, char **argv)
{

    if(argc == 1)
	{
		printf("请给我至少一个文件的路径\n");
		return 0;
	}

    int i=0;
    for(i=1;i<argc;i+=2){
        int fd1 = open(argv[i],O_RDONLY);
        int fd2 = open(argv[i+1],O_WRONLY|O_CREAT,0777);
        char buf[12];

        //文件的复制
        while(1){
            //内存清空
            memset(buf,0,sizeof(buf));
            //读文件
            ssize_t n = read(fd1,buf,sizeof(buf)-1);
            //写文件
            write(fd2,buf,strlen(buf));

            if(n==0){
                close(fd1);
                close(fd2);
                break;
            }

        }
    }

    
    return 0;
}



7.2 自我实现两个文件的比较diff函数

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

//自我实现diff函数

int main(int argc,char** argv)
{

    if(argc == 1)
	{
		printf("请给我至少一个文件的路径\n");
		return 0;
	}

    //打开两个文件
    int fd1 = open(argv[1],O_RDONLY);
    int fd2 = open(argv[2],O_RDONLY);
    char buf1[5] = {0};
    char buf2[5] = {0};

    int flag = 0;//两文件相同

    while(1){
        //读取文件
        memset(buf1,0,sizeof(buf1));
        memset(buf2,0,sizeof(buf2));

        ssize_t n1 = read(fd1,buf1,sizeof(buf1)-1);
        ssize_t n2 = read(fd2,buf2,sizeof(buf2)-1);

        //比较读取出来的buf
        if(strcmp(buf1,buf2)!=0){
            flag = 1;//不同

            break;
        }

        if(n1==0){
            close(fd1);
            break;
        }
        if(n2==0){
            close(fd2);
            break;
        }
    }

    //至此
    if(flag){
        printf("两个文件不同\n");
    }else{
        printf("两文件相同\n");
    }
 
    return 0;
}


http://www.kler.cn/a/154417.html

相关文章:

  • 哈希表学习分享
  • 针对股票评论的情感分类器
  • 嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)
  • SOLIDWORKS Toolbox:一键自动化,让紧固件与零部件管理更高效
  • IDEA2024:右下角显示内存
  • 整数唯一分解定理
  • 2023.11.28-电商平台建设03 - 大数据调优手段
  • install pnpm : 无法加载文件的解决办法
  • 【智能家居】一、工厂模式实现继电器灯控制
  • 【ShardingSphere专题】SpringBoot整合ShardingSphere(一、数据分片入门及实验)
  • jquery 判断是手机端还是电脑端
  • 独家揭秘:卢松松拍摄视频背后的创作过程
  • 使用系统ProgressBar实现三色进度条
  • 【开源视频联动物联网平台】JAIN-SIP库写一个SIP服务器
  • 面试就是这么简单,offer拿到手软(一)—— 常见非技术问题回答思路
  • Vue - Vue配置proxy代理,开发、测试、生产环境
  • linux CentOS MobaXterm 通过X11 Forwarding 在本地开启图形可视化窗口
  • 链表数组插入排序
  • Hdoop学习笔记(HDP)-Part.05 Yum源配置
  • CH58x-BLE 程序阅读笔记
  • 【ChatGTP】将GPT当作团队成员
  • 【JavaSE学习专栏】第04篇 Java面向对象
  • <软考>软件设计师-1计算机组成与结构(总结)
  • 详细学习Pyqt5的20种输入控件(Input Widgets)
  • 搭建nfs文件目录共享
  • Unity 加载本地图片的方法