linux系统下的c编程——my first program

今天学习了在linux如何写复制文件的函数,在学习了书上一些基础的库函数和语句后,我自己编写了一个复制文件的函数,虽然过程有些坎坷,但写完还是觉得自己棒棒哒~

#include <stdio.h>
#include<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define PERMS 0666
#define DUMMY 0
#define BUFSIZE 1024
main(int argc,char *argv[])                     //要求用户用cp格式输入命令(cp替换为./a.out)
{
    int source_fd,target_fd,num;
    char iobuffer[BUFSIZE];
    if(argc!=3)                                 //若输入格式正确(./a.out os.c b.c,os.c为源文件,b.c为新文件),则可以开始打开文件
    {   
        printf("复制功能打开失败");
        return 1;
    }
    if((source_fd=open(*(argv+1),O_RDONLY,DUMMY))==-1)    //打开源文件失败open函数会返回-1,将open函数返回的值赋给文件描述符
    {
        printf("1文件打开失败");
        return 2;
    }
    if((target_fd=open(*(argv+2),O_WRONLY|O_CREAT,PERMS))==-1)   //我的文件夹里没有b.c文件,所以会自动建立b.c文件,建立成功返回-1
    {
        printf("2文件打开失败");
        return 3;
    }
    while((num=read(source_fd,iobuffer,BUFSIZE))>0)       //将源文件里的内容读到iobuffer中,若返回值小于0,则读完文件,跳出循环
    if(num!=write(target_fd,iobuffer,num))                //读的字节数要和写入的字节数保持一致,否则出错,跳出程序
    {
        printf("文件复制错误");
        return 4;
    }
    close(source_fd);                   //复制完成,关闭源文件
    close(target_fd);                   //复制完成,关闭新文件
}

但是运行结果貌似有点问题呢。。

这里写图片描述

最后几行好像不见了。。

(昨天没有写完)今天回来改错,却发现错误奇迹的自己好了。。

这里写图片描述

但是我发现了一个新的问题,就是已经写过的文件不能重新写入,也就是内容不可以覆盖,于是我重新检查了一遍代码,我发现我的write函数里少了一个参数O_TRUNC 这个参数是如果文件存在,则该文件截断 的意思,也就是可以覆盖已经存在的文件,因为少了这个参数,所以不可以覆盖。

加了这个参数就对了,已经创建的文件也可以覆盖粘贴。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值