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

标准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) 来确保每次读取的字节数不超过缓冲区的大小。

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

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

猜你喜欢

转载自blog.csdn.net/m0_56694518/article/details/131253038