Linux 系统调用IO口,利用光标偏移实现文件复制

这篇具有很好参考价值的文章主要介绍了Linux 系统调用IO口,利用光标偏移实现文件复制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用系统调用IO函数实现从一个文件读取最后2KB数据并复制到另一个文件中,源文件以只读方式打开,目标文件以只写的方式打开,若目标文件不存在,可以创建并设置初始值为0664,写出相应代码,要对出错情况有一定的处理,并能够让用户自行输入要复制的文件名。

IO口即指Input和Outpot,常用的IO函数open() , close() , read() , write() ,lseek()。本节也围绕以上函数完成。

题目分析:

本质:从一个文件读取,然后写到另一个文件里。

添加形容:

源文件(要读取的文件),目标文件(要写入的文件)

源文件以只读方式打开:from_writed=open(argv[1],O_RDONLY);

目标文件以只写方式打开:to_readed=open(argv[2],O_WRONLY);

若目标文件不存在可以创建并设置初始值为0664:to_readed=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);

命令简介:

O_RDONLY --以只读命令打开文件

O_WRONLY--以只写命令打开文件

O_WRONLY--以读写命令打开文件

O_CREAT--若文件不存在则创建

O_TRUNC--若文件存在则清除原有数据

最后一个参数mode 是文件权限,0代表没有权限,1代表可执行权限,2代表可写权限,4代表可读权限,将其相加可得0~7的八进制数。

0664表示的是 文件所有者可读可写,和文件所有者同组用户可读可写,其他用户可读。

对出错情况有一定的处理:

if(xx<0)

{

  printf("can't open %s",argv[x]);
  return-1

}

或者

if(xx<0)
{
  perror("xx");
 }

(要使用perror(),前提引用库函数 #include<error.h>

让用户自行输入要复制的文件名:

这里主函数里写入参数

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

argc用来传参,此篇argc一共有三个参数,除了程序名还有两个,分别是源文件和目标文件(“要被复制的文件”和“要复制到的文件”),基于此实现用户自行输入要复制的文件名。

 读取源文件最后2kb的数据:

用lseek()函数实现

int len;

len=lseek(from_writed,-70,SEEK_END);

题目要求是最后2kb,但是2048太大了,我写的文件比较小,我就偏移个最后70,刚好是我文件最后一句话。

大家自己看,想偏多少都行。

函数原型

off_t lseek(int fd , off_t offset, int whence)

先来说一下这个off_t类型吧,它用于指示文件的偏移量。你可以就简单的理解为这是一个64位的整形数,相当于long long int,其定义在unistd.h头文件中可以查看。

参数:fd //文件描述符,可以通过open函数得到,通过这个fd可以操作某个文件
参数: offset //文件偏移量,是一个整形数
参数:whence //偏移类型,下列三个值中选一个。

offset:

     offset > 0 向后偏移

     offset < 0 向前偏移

whence :
     SEEK_SET:从文件头开始偏移
     SEEK_CUR:从当前位置开始偏移
     SEEK_END:从文件尾开始偏移

在使用这个函数之前,我们需要往C/C++文件中导入这些头文件:

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

 到此题目就分析完了。

写代码

先创个源文件

vi LLL

Linux 系统调用IO口,利用光标偏移实现文件复制,linux

IO实现文件全部复制

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <error.h>
int main(int argc, char *argv[])
{
    if(argc != 3)
 {
    printf("Input error\n");
    exit(1);
 }
    int fp_from = open(argv[1], O_RDONLY);//只读
    if(fp_from==-1)
    {
        printf("open %s error\n",argv[1]);
        exit(2);
    }
    int fp_to = open(argv[2], O_WRONLY | O_CREAT, 0644);//读写,不存在则创建
    if(fp_to==-1)
    {
        printf("open %s error\n",argv[2]);
        exit(3);
    }
    int buf[1024] = {0};
    ssize_t ret;
    while(1)
   {
       ret = read(fp_from,buf,sizeof(buf) - 1);//从源文件读

       if(ret == -1)
      {
            perror("read");
      }
      else if(ret == 0)
      {
            printf("拷贝完毕\n");
            break;
      }
      ret == write(fp_to,buf,ret); //向目标文件写
      if(ret == -1)
     {
            perror("write");
     }
   }
 close(fp_from);
 close(fp_to);
    return 0;
}
                                                                                                                                                                                       

运行结果:

Linux 系统调用IO口,利用光标偏移实现文件复制,linux

Linux 系统调用IO口,利用光标偏移实现文件复制,linux

利用光标偏移,IO实现文件部分复制

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char **argv)
{       int from_writed;  //源文件
        int to_readed;    //目标文件
        int l_writed;     //写入长度
        int l_readed;     //读取长度
        int buf[2048];
        int len;         //偏移长度
        if(argc != 3)
        {
                printf("Input error\n");
                return -1;
        }
       from_writed=open(argv[1],O_RDONLY);//以只读方式打开源文件
       if(from_writed<=0)
        {
                 printf("can't oppen %s\n",argv[1]);
                return -1;
        }
        to_readed=open(argv[2],O_WRONLY);//以只写方式打开目标文件
        if(to_readed<=0)  //如果文件不存在
        {
                to_readed=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
                                            //读写方式|不存在则创建|存在则清除数据,权限0664
 
               if(to_readed<=0)
                {
                        printf("can't open %s\n",argv[2]);
                        return -1;
                }
        }
        while(1)
        {
               //     off_t len;

                len=lseek(from_writed,-70,SEEK_END); //移动光标至文件末尾前70个数据
                if(len>0)
                {
                        printf("current off_t : %d\n",len);输出当前光标位置所在
                }

                l_readed=read(from_writed,buf,2048);    //从源文件读取
                if(l_readed<0)
               {
                        printf("can't read from %s\n",argv[1]);
                        return -1;
                }
                if(l_readed>0)
                {
                        l_writed=write(to_readed,buf,l_readed);//写入到目标文件
                        if(l_writed>0)
                        {
                                printf("拷贝完毕\n");
                                break;
                        }
                        if(l_writed<0)
                        {
                                printf("can't write to %s\n",argv[2]);
                                return -1;
                        }
                }
                else
                break;
        }
        close(from_writed);
        close(to_readed);
        return 0;

}

                                                                           

还利用上面那个LLL文件

运行:

Linux 系统调用IO口,利用光标偏移实现文件复制,linux

查看:

Linux 系统调用IO口,利用光标偏移实现文件复制,linux

刚好偏移最后一句话。文章来源地址https://www.toymoban.com/news/detail-718678.html

到了这里,关于Linux 系统调用IO口,利用光标偏移实现文件复制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】文件周边001之系统文件IO

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.C语言文件IO 1.1C语言文件IO接口汇总  1.2当前路径指的是什么?  1.3stdi

    2024年01月24日
    浏览(33)
  • 【Linux】基础IO——系统文件IO&&fd&&重定向

    大家好我是沐曦希💕 空文件,也要在磁盘占据空间,因为文件也有属性,属性也属于数据,需要空间进行存储。所以 文件包括内容和属性 所以 对文件操作就是对内容或者对属性进行操作,或者对内容和属性进行操作。 文件具有唯一性,所以在 标定一个文件时候,必须使用

    2024年02月02日
    浏览(33)
  • 【Linux】基础IO_文件系统

     环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【C/进阶】如何对文件进行读写(含二进制)操作? 【Linux】基础IO_文件操作 【Linux】基础IO_文件描述符与重定向 在前文我们所讲的都是

    2024年02月05日
    浏览(31)
  • Linux之基础IO文件系统讲解

    在C语言中,读文件和写文件是常见的操作,用于从磁盘读取数据到内存或将数据从内存写入磁盘文件中。这些操作需要使用标准库中的文件I/O函数。下面我将详细解释如何在C语言中进行读文件和写文件操作,并举例说明。 在C语言中,读取文件的过程涉及以下步骤: 打开文

    2024年02月11日
    浏览(29)
  • 【Linux操作系统】举例解释Linux系统编程中文件io常用的函数

    在Linux系统编程中,文件IO操作是非常常见和重要的操作之一。通过文件IO操作,我们可以打开、读取、写入和关闭文件,对文件进行定位、复制、删除和重命名等操作。本篇博客将介绍一些常用的文件IO操作函数。 1.1 原型、参数及返回值说明 1.1.1 原型: open()函数是Linux系统

    2024年02月12日
    浏览(29)
  • 【Linux】基础IO——文件系统|软硬链接|动静态库

    基于上篇博客所写到的文件各种操作都是基于被打开文件所进行操作的,那么如果一个文件没有被打开它存在哪里呢?这个答案毫无疑问肯定是存在于磁盘上的。那么,对于一个没有打开的文件(也就是磁盘文件)我们应该如何理解呢? 这里我们所要讲的磁盘是机械硬盘、即

    2024年02月04日
    浏览(32)
  • 【Linux】基础 IO(文件系统 & inode & 软硬链接)-- 详解

    1、前言 我们一直都在说打开的文件,磁盘中包含了上百万个文件,肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件,下面重点谈谈未打开的文件。 我们知道打开的文件是通过操作系统被进程打开,一旦打开,操作系统就要维护多个文件,

    2024年03月21日
    浏览(34)
  • Linux文件(系统)IO(含动静态库的链接操作)

    fopen打开文件,fclose关闭文件 fwrite操作(写文件) fwrite函数从 ptr 里将 nitems 个大小为 size 字节的数据写进定 stream 里 hello_w.c 文件 这里我们将会在此路径得到一个写有 5 行 hello fopen 的 myfile.txt 文件,如下gif: fread操作(写文件) fread 不会在字符串末尾添加 null 终止符( \\0

    2024年04月14日
    浏览(35)
  • 【Linux后端服务器开发】基础IO与文件系统

    目录 一、基础IO 1. C语言文件读写 2. 标志位传参 3. C语言与系统调用关系 二、文件系统 1. 文件描述符 2. 输入输出重定向 文件调用 库函数接口: fopen、fclose、fwrite、fread、fseek 系统调用接口:open、close、write、read、lseek r/w/a :读/写/追加 若打开的文件不存在,“r”报错,“

    2024年02月15日
    浏览(49)
  • [Linux]基础IO详解(系统文件I/O接口、文件描述符、理解重定向)

            hello,大家好,这里是bang___bang_ ,今天和大家谈谈Linux中的基础IO,包含内容有对应的系统文件I/O接口,文件描述符,理解重定向。    目录 1️⃣初识文件 2️⃣ 系统文件I/O接口 🍙open 🍙write 🍙read 🍙close 3️⃣文件描述符 🍙012 🍙内核中文件描述符的探究 🍙分配

    2024年02月12日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包