嵌入式C文件IO O_APPEND解决文件共享操作数据覆盖问题以及文件拷贝

open函数注意事项

O_APPEND解决文件共享操作数据覆盖问题

多次open同一文件,实现共享操作时,指定O_APPEND可以防止数据相互覆盖的发生

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
int main(int argc,  char **argv)
{
    int fd;
    if((fd = open(argv[1],O_WRONLY | O_CREAT ,0655))<0)
    {
        perror("open file error!");
        exit(1);
    }

    while(1)
    {
        write(fd,"hello",5);
        write(fd,"world",5);
        write(fd,"\n",1);
    }
    close(fd);


    return 0;
}

file1

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
int main(int argc,  char **argv)
{
    int fd;
    if((fd = open(argv[1],O_WRONLY | O_CREAT ,0655))<0)
    {
        perror("open file error!");
        exit(1);
    }

    while(1)
    {
        write(fd,"hhhhh",5);
        write(fd,"wwwww",5);
        write(fd,"\n",1);
    }
    close(fd);


    return 0;
}

file2

若同时向demo.txt写数据时,
图示:
在这里插入图片描述

未使用O_APPEND的情况
在这里插入图片描述
使用O_APPEND的情况

初级IO 文件拷贝

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

argc是外部输入的参数个数,argv[ ]是参数的字符串数组。

#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char **argv)
{
    if(argc != 3)
    {
        printf("please input two filename!\n");
        exit(1);
    }
    int to_fd;
    int from_fd;
    int nr;
    int nw;

    struct stat file;
    fstat(from_fd,&file);
    int file_size= file.st_size;

    char buffer[1024]={0};

    if((from_fd = open(argv[1], O_RDONLY | O_CREAT,0655))<0)
    {
        perror("open from file error!");
        //printf("error");
        exit(1);
    }
    if((to_fd = open(argv[2], O_WRONLY | O_CREAT,0655))<0)
    {
        perror("open to file error!");
        //printf("error");
        exit(1);
    }

    while((nr=read(from_fd,buffer,sizeof(buffer)))!= 0)
    {
        //printf("%s",buffer);
        if((nw = write(to_fd,buffer,strlen(buffer)))<0)
        {
            perror("write data error");
            exit(1);
        }
        //memset(buffer,0,sizeof(buffer));

        file_size=file_size -nw;
        if(file_size<=0)
        {
            break;
        }
        memset(buffer,0,sizeof(buffer));
    }
    printf("file cp successful\n");
    close(from_fd);
    close(to_fd);
    return 0;

}

在这里插入图片描述

通过读一行写一行来实现文件拷贝(初步实现)

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

int read_line(int fd,void  * ptr,int max_len)
{
    int nr;
    int i=0;
    char *buffer = (char *)ptr;
    char temp;
    
    while(nr=(read(fd,&temp,1))>=0)
    {
        if(nr == 0)
        {
            return 0;
        }
        if(temp == '\n')
        {
            buffer[i]='\0';
            return i;
        }
        else
        { 
            buffer[i]=temp;
        }
        i++;
    }

    if(nr<0)
    {
        perror("read error!");
        exit(1);
    }

    return i;

}

read_line.c

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<errno.h>
extern int read_line(int,void *,int);

int main(int argc , char **argv)
{
    if(argc!=2)
    {
        printf("please input file name!\n");
        exit(1);
    }
    int fd;
    char buffer[1024];
    if((fd= open(argv[1],O_RDWR | O_CREAT,0655))<0)
    {
        perror("open file error!");
        exit(1);
    }

    for(int i=0;i<3;i++)
    {
        memset(buffer,0,sizeof(buffer));
        printf("please input data:\n");
        scanf("%s",buffer);
        if(write(fd,buffer,strlen(buffer))<0)
        {
            perror("write data error!");
            exit(1);
        }
        write(fd,"\n",1);

    } 

    lseek(fd,0,SEEK_SET);

    memset(buffer,0,sizeof(buffer));
    /*if((read(fd,buffer,sizeof(buffer)))<0)
    {
        perror("read data error!");
        exit(1);
    }
    printf("buffer = %s\n",buffer);*/
    while(read_line(fd,buffer,sizeof(buffer)-1) !=0)
    {
        printf("%s\n",buffer);
        memset(buffer,0,sizeof(buffer));
    }

    close(fd);
    return 0;
}

filedemo.c

在这里插入图片描述

作业

统计一个文件中单词的个数
[https://blog.csdn.net/u010166404/article/details/46353263]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值