标准IO和文件IO分别实现cp功能(嵌入式学习)

news2024/12/24 2:36:41

标准IO和文件IO分别实现cp功能

  • 标准IO实现cp功能
    • 标准IO概念
    • 代码实现
  • 文件IO实现cp功能
    • 文件IO概念
    • 代码实现

标准IO实现cp功能

标准IO概念

想了解标准IO的概念,请点击这里——》IO进程——标准IO(嵌入式学习)
IO进程——标准IO(嵌入式学习)《——
IO进程——标准IO(嵌入式学习)《——
IO进程——标准IO(嵌入式学习)《——
在这里插入图片描述

标准I/O(Standard I/O)是指在操作系统中用于进行输入和输出的标准化接口。它提供了一组函数和缓冲区,使得对文件、终端和其他设备的读取和写入操作更加方便和高效。

在标准I/O中,文件(file)被抽象为一个数据流,可以通过文件指针(file pointer)来进行读取和写入操作。标准I/O库提供了一系列函数来处理文件的打开、关闭、读取、写入等操作。

以下是一些常用的标准I/O函数:

  1. FILE *fopen(const char *path, const char *mode): 打开一个文件,并返回一个指向该文件的文件指针。path 是文件的路径,mode 是打开文件的模式(例如,“r” 表示只读,“w” 表示写入,“a” 表示追加等)。

  2. int fclose(FILE *stream): 关闭一个文件。

  3. size_t fread(void *ptr, size_t size, size_t count, FILE *stream): 从文件中读取数据到指定的内存缓冲区。ptr 是目标缓冲区的指针,size 是每个数据项的大小,count 是要读取的数据项的个数,stream 是文件指针。

  4. size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream): 将指定的内存缓冲区的数据写入到文件中。ptr 是源缓冲区的指针,size 是每个数据项的大小,count 是要写入的数据项的个数,stream 是文件指针。

  5. int fgetc(FILE *stream): 从文件中读取一个字符。

  6. int fputc(int c, FILE *stream): 将一个字符写入文件。

  7. char *fgets(char *str, int num, FILE *stream): 从文件中读取一行文本。

  8. int fputs(const char *str, FILE *stream): 将一行文本写入文件。

  9. int fprintf(FILE *stream, const char *format, ...): 格式化输出到文件。

  10. int fscanf(FILE *stream, const char *format, ...): 从文件中按照指定格式读取数据。

标准I/O提供了缓冲功能,即将数据先存储在内存缓冲区中,然后在合适的时机进行实际的读写操作。这种缓冲机制可以提高效率,减少对底层文件系统的访问次数。

标准I/O还提供了一些函数来操作文件指针,比如定位文件指针到指定位置、获取文件大小等。

代码实现

要实现cp功能,可以使用标准I/O库函数来处理文件的读取和写入操作。下面是一个使用标准I/O实现cp功能的示例代码:

#include <stdio.h>

#define BUFFER_SIZE 4096

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

    FILE *source_file = fopen(argv[1], "rb");
    if (!source_file) {
        printf("Error opening source file.\n");
        return 1;
    }

    FILE *destination_file = fopen(argv[2], "wb");
    if (!destination_file) {
        printf("Error creating destination file.\n");
        fclose(source_file);
        return 1;
    }

    char buffer[BUFFER_SIZE];
    size_t bytesRead;

    while ((bytesRead = fread(buffer, 1, sizeof(buffer), source_file)) > 0) {
        fwrite(buffer, 1, bytesRead, destination_file);
    }

    fclose(source_file);
    fclose(destination_file);

    printf("File copied successfully.\n");

    return 0;
}

在上面的示例代码中,首先检查命令行参数是否正确,要求提供源文件和目标文件的路径。然后,我们使用fopen函数打开源文件和目标文件,分别用于读取和写入操作。

使用一个缓冲区buffer来循环读取源文件的内容,并将其写入目标文件。fread函数用于从源文件中读取数据,fwrite函数用于将数据写入目标文件。使用sizeof(buffer)来确保每次读取的字节数不超过缓冲区的大小。

关闭源文件和目标文件,释放资源,并输出成功的消息。

文件IO实现cp功能

文件IO概念

想了解标准IO的概念,请点击这里——》IO进程——文件IO(嵌入式学习)
IO进程——文件IO(嵌入式学习)《——
IO进程——文件IO(嵌入式学习)《——
IO进程——文件IO(嵌入式学习)《——

文件 I/O(Input/Output)是指在计算机系统中进行文件读取和写入的操作。它涉及从文件中读取数据以及将数据写入到文件中的过程。

文件是存储在永久性存储介质上(如硬盘、闪存等)的有序数据集合。文件 I/O 允许程序通过读取和写入文件来访问和操作这些数据。文件 I/O 涉及的操作包括打开文件、读取文件内容、写入数据到文件、移动文件指针等。

在文件 I/O 中,通常使用文件描述符(file descriptor)或文件指针来标识和访问文件。文件描述符是一个非负整数,由操作系统分配给打开的文件,用于标识文件的唯一性。文件指针则是一个数据结构,包含了文件的相关信息,如文件描述符、读写位置等。

文件 I/O 可以分为两种模式:文本模式和二进制模式。

  • 文本模式:以文本形式处理文件数据,适用于处理包含字符数据的文件,如文本文件。在文本模式下,文件内容按行读取和写入,并进行一些文本格式的转换,比如换行符的处理。

  • 二进制模式:以原始数据形式处理文件数据,适用于处理非字符数据的文件,如图像、音频、视频等二进制文件。在二进制模式下,文件内容以原始字节的形式进行读取和写入,不进行字符转换或格式处理。

文件 I/O 的基本操作包括:

  1. 打开文件:通过指定文件路径和访问模式(只读、只写、读写等),打开文件以供后续读取或写入操作使用。

  2. 读取文件:从打开的文件中读取数据,可以按字节、行或特定格式进行读取。

  3. 写入文件:将数据写入到已打开的文件中,可以按字节、行或特定格式进行写入。

  4. 关闭文件:完成文件读写操作后,关闭文件以释放系统资源并确保数据写入完成。

  5. 定位文件指针:移动文件指针到特定位置,以便进行读取或写入操作。

  6. 错误处理:对文件 I/O 操作中可能出现的错误进行处理,如文件打开失败、读取错误、写入错误等。

文件 I/O 的实现方式有多种,包括使用标准库函数(如 C 语言中的标准 I/O 库函数)、使用操作系统提供的系统调用(如 POSIX I/O、Windows API)等。

代码实现

要使用文件 I/O 实现 cp 功能,可以使用文件描述符(file descriptor)和 read()write() 函数来实现文件的读取和写入操作。以下是一个使用文件 I/O 实现 cp 功能的示例代码:

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

#define BUFFER_SIZE 4096

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

    int source_fd = open(argv[1], O_RDONLY);
    if (source_fd == -1) {
        printf("Error opening source file.\n");
        return 1;
    }

    int destination_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if (destination_fd == -1) {
        printf("Error creating destination file.\n");
        close(source_fd);
        return 1;
    }

    char buffer[BUFFER_SIZE];
    ssize_t bytesRead, bytesWritten;

    while ((bytesRead = read(source_fd, buffer, sizeof(buffer))) > 0) {
        bytesWritten = write(destination_fd, buffer, bytesRead);
        if (bytesWritten != bytesRead) {
            printf("Error writing to destination file.\n");
            close(source_fd);
            close(destination_fd);
            return 1;
        }
    }

    if (bytesRead == -1) {
        printf("Error reading from source file.\n");
        close(source_fd);
        close(destination_fd);
        return 1;
    }

    close(source_fd);
    close(destination_fd);

    printf("File copied successfully.\n");

    return 0;
}

在上面的示例代码中,首先检查命令行参数是否正确,要求提供源文件和目标文件的路径。然后,使用 open() 函数打开源文件和目标文件,分别用于读取和写入操作。O_RDONLY 表示只读打开源文件,O_WRONLY | O_CREAT | O_TRUNC 表示创建或截断目标文件并以写入模式打开,0666 是新建目标文件的权限。

使用一个缓冲区 buffer 来循环读取源文件的内容,并将其写入目标文件。read() 函数用于从源文件中读取数据,write() 函数用于将数据写入目标文件。使用 sizeof(buffer) 来确保每次读取的字节数不超过缓冲区的大小。

在每次写入数据后,检查实际写入的字节数是否与读取的字节数相同,以确保写入操作成功。

关闭源文件和目标文件的文件描述符,释放资源,并输出成功的消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/654151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】三子棋详解(包教包会的那种)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 三子棋及五子棋详解 前言三子棋的实现1. 打印菜单2.初始化并打印棋盘棋盘初始化函数功能的实现打印棋盘 3.玩家下棋与模拟电脑下棋玩家下棋电脑下棋随机数的生成 4.判断输赢我们的game函数 源码game.hgame.ctest.c 总结 …

PMP课堂模拟题目及解析(第18期)

171. 一个项目已经结束&#xff0c;然而&#xff0c;项目经理和项目团队成员仍然被要求解决技术问题&#xff0c;进行一些变更&#xff0c;并评估新的需求。若要保证项目开发的产品或服务现在具有运营支持&#xff0c;项目经理应该执行下列哪些工作&#xff1f; &#xff08;选…

Nacos配置中心交互模型是push还是pull?

对于Nacos大家应该都不太陌生&#xff0c;出身阿里名声在外&#xff0c;能做动态服务发现、配置管理&#xff0c;非常好用的一个工具。然而这样的技术用的人越多面试被问的概率也就越大&#xff0c;如果只停留在使用层面&#xff0c;那面试可能要吃大亏。 比如我们今天要讨论的…

44从零开始学Java之详解容易让初学者懵圈的abstract抽象类、抽象方法

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 经过前面几篇文章的讲解&#xff0c;我们现在已经对面向对象有了基本的认知&#xff0c;掌握了面向对…

基于Java员工信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

2.04_基于矩阵分解的协同过滤推荐

矩阵分解发展史 Traditional SVD: 通常SVD矩阵分解指的是SVD(奇异值)分解技术,在这我们姑且将其命名为Traditional SVD(传统并经典着)其公式如下: Traditional SVD分解的形式为3个矩阵相乘,中间矩阵为奇异值矩阵。如果想运用SVD分解的话,有一个前提是要求矩阵是稠密…

AAC ADTS格式分析

标题 1.AAC简介2. AAC ADTS格式分析2.1 adts_fixed_header详细介绍2.2 adts_variable_header详细介绍 1.AAC简介 AAC音频格式:Advanced Audio Coding(⾼级⾳频解码)&#xff0c;是⼀种由MPEG-4标准定义的有损⾳频压缩格式&#xff0c;由Fraunhofer发展&#xff0c;Dolby, Sony…

[CISCN 2023 初赛]puzzle 解析

打开文件包给了一堆拼图碎片&#xff0c;由于文件数量高达2880张&#xff0c;这里不考虑gaps的方式进行修正拼图 &#xff08;因为跑了也只会把gaps跑冒烟&#xff09; tmp类型的拼图&#xff0c;因为tmp文件特性在文件头的位置会有其在原图片上的位置坐标 于是&#xff0c;我…

MyBatis-Plus一级缓存和二级缓存-redis解决缓存的脏数据

MyBatis-Plus一级缓存和二级缓存 文章目录 MyBatis-Plus一级缓存和二级缓存[TOC](文章目录) 基本缓存问题一级缓存-MyBatis默认打开一级缓存、不允许关闭二级缓存&#xff08;默认是开启)注意:二级缓存的作用域不然更新了数据,还是使用查询到缓存的数据&#xff09;操作演示第一…

系统编程(1):基本程序框架--IO

文章目录 一、main函数二、IO&#xff08;输入/输出&#xff09;2.1 标准IO和文件IO2.2 文件描述符2.2 open函数 一、main函数 #include <stdio.h> #include <stdlib.h>int main(int argc, char* argv[]) {// argc&#xff1a;表示是命令行中参数的个数// argv&am…

天融信堡垒机怎么结合国密OTP动态令牌实现双因子身份认证?

摘要&#xff1a; 结合宁盾国密OTP动态令牌为天融信堡垒机登录开启双因子身份认证机制&#xff0c;能有效增强运维人员的账号安全&#xff0c;满足等保合规要求。 天融信运维安全审计系统&#xff08;简称“堡垒机”&#xff09;是面向政府、企事业单位等组织机构推出的兼具运…

一篇文章教你pytest+yaml实现参数化

目录 一、使用背景 二、parametrize 三、yaml 四、将yaml数据转换成parametrize可读的列表形式 总结&#xff1a; 一、使用背景 当我们在设计用例的时候&#xff0c;经常会出现需要不同参数的情况&#xff0c;例如一个登录的用例&#xff0c;我们需要测试它登录名正常、为…

【JAVA集合篇】深入理解HashMap源码

文章目录 HashMap简介源码分析关键参数获取数组下标put方法resize扩容过程jdk1.7的扩容实现jdk1.8的扩容实现 get()方法remove()方法 总结 关于HashMap&#xff0c;一直都是一个非常热门的话题&#xff0c;只要你出去面试&#xff0c;一定少不了它&#xff01; 本文主要结合 JD…

Scala--04

第 8 章 高级语法 Scala//需求&#xff1a;制作一个计算器&#xff0c;实现你传一个字符串给我&#xff0c;比如 23&#xff0c;然后我返回一个结果5给你 def plus(str: String): String { var res "" if (str.contains("")) { val arr: Array[S…

Halcon 循环找出多张电路板上的焊盘 (PCB板的有效区域在图中位置不一样)

文章目录 1 问题描述2 关键代码演示2.1 缩减范围,提高效率2.2 求差,去掉矩形块,只剩下圆3.3 最终效果3 完整代码1 问题描述 如图,循环找出下面四张电路板上的 焊盘; 四张图的有效区域在图中的位置不一样; 且图中还有和焊盘区域相近的矩形黑块; 为了提高效率,先找到产…

[数据分析与可视化] Python绘制数据地图3-GeoPandas使用要点

本文主要介绍GeoPandas的使用要点。GeoPandas是一个Python开源项目&#xff0c;旨在提供丰富而简单的地理空间数据处理接口。GeoPandas扩展了Pandas的数据类型&#xff0c;并使用matplotlib进行绘图。GeoPandas官方仓库地址为&#xff1a;GeoPandas。GeoPandas的官方文档地址为…

模糊聚类在负荷实测建模中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python如何把列表自定义分组后并重复2次

一、问题的由来 之前&#xff0c;我写过一篇调用同花顺机器翻译api&#xff0c;批量翻译字幕的文章。 在调用机器翻译api过程中&#xff0c;我遇到一个问题&#xff0c;就是网站给的Python样例代码中只接收字符长度少于5000的列表&#xff0c;所以我想&#xff0c;如果我们一…

Docker常用命令(+仓库,镜像,容器的关系)

一、仓库&#xff08;repository&#xff09;&#xff0c;镜像&#xff08;image&#xff09;&#xff0c;容器&#xff08;container&#xff09;的关系 Docker 是一个开源的C/S架构应用容器引擎&#xff08;客户端&#xff08;client&#xff09;和服务端&#xff08;server&…

Android实现一个可拖拽带有坐标尺的进度条

拿到上边的UI效果图&#xff0c;给我的第一印象就是这实现起来也太简单了吧&#xff0c;SeekBar轻轻松松就搞定了&#xff0c;换个thumb&#xff0c;加个渐变不就完成了&#xff0c;说搞就搞&#xff0c;搞着搞着就抑郁了&#xff0c;底部坐标尺还能搞&#xff0c;等比例分割后…