C 编程,使用命令行参数从一个文件复制到另一个文件

Posted

技术标签:

【中文标题】C 编程,使用命令行参数从一个文件复制到另一个文件【英文标题】:C programming, copying from one file to another using command line arguments 【发布时间】:2021-12-20 04:45:10 【问题描述】:

这是我的代码

#include <stdio.h>
#include <stdlib.h>

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

    if (argc < 4) 
        printf("Missing arguments\n");
        return -1;
    

    // Check if buffer is valid before reading anything
    int bufferSize = atoi(argv[3]);
    if (!bufferSize || bufferSize < 1) 
        printf("Invalid buffer size\n");
        return -1;
    

    printf("*** Copying from '%s' to '%s' (Buffer size: %dB) ***\n",
           argv[1], argv[2], bufferSize);

    // READ SOURCE FILE
    FILE *inputFile = fopen(argv[1], "r");
    if (!inputFile) 
        printf("Error opening source file\n");
        return -1;
    

    // READ DESTINATION FILE
    FILE *outputFile = fopen(argv[2], "w");
    if (!outputFile) 
        printf("Error opening destination file\n");
        return -1;
    

    int buffer[bufferSize];
    int bytes;
    do 
        bytes = fread(buffer, 1, bufferSize, inputFile);
        if (fwrite(buffer, 1, bytes, outputFile) != bytes) 
            printf("Error writing into destination file\n");
            return -1;
        
     while (bytes > 0);

    fclose(inputFile);
    fclose(outputFile);

    return 0;

但是当我尝试执行该文件时它不起作用。可能是什么问题呢? 这是命令行:

/Users/jurajc/Documents/Program/C/L1\ 1/C_program/c_program file.txt fileCopy.txt 512 
*** Copying from 'file.txt' to 'fileCopy.txt' (Buffer size: 512B) ***
Error opening source file

【问题讨论】:

与您启动程序的目录相比,输入文件位于何处?执行“ls -l” 您可以在post中找到如何打印错误信息 【参考方案1】:

无法打开输入文件file.txt:因为它不在当前目录中,或者因为您没有读取权限。

您应该输出更多信息性错误消息。还要注意这些问题:

if (!bufferSize || bufferSize &lt; 1) 是一个冗余测试。 if (bufferSize &lt; 1) 就足够了。 错误信息应该输出到stderr 文件应以二进制模式打开,以便可靠地复制旧系统上的所有文件类型。 读/写循环不正确:您应该在fread 返回0 时停止尝试将0 元素写入输出文件之前。

这是修改后的版本:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

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

    if (argc < 4) 
        fprintf(stderr, "Missing arguments\n");
        return -1;
    

    // Check if buffer is valid before reading anything
    int bufferSize = atoi(argv[3]);
    if (bufferSize < 1) 
        fprintf(stderr, "Invalid buffer size: %s\n", argv[3]);
        return -1;
    

    printf("*** Copying from '%s' to '%s' (Buffer size: %dB) ***\n",
           argv[1], argv[2], bufferSize);

    // READ SOURCE FILE
    FILE *inputFile = fopen(argv[1], "rb");
    if (!inputFile) 
        fprintf(stderr, "Error opening source file %s: %s\n", 
                argv[1], strerror(errno));
        return -1;
    

    // READ DESTINATION FILE
    FILE *outputFile = fopen(argv[2], "wb");
    if (!outputFile) 
        fprintf(stderr, "Error opening destination file %s: %s\n", 
                argv[2], strerror(errno));
        return -1;
    

    int buffer[bufferSize];
    int bytes;
    while ((bytes = fread(buffer, 1, bufferSize, inputFile)) != 0) 
        if (fwrite(buffer, 1, bytes, outputFile) != bytes) 
            fprintf(stderr, "Error writing into destination file: %s\n", strerror(errno));
            return -1;
        
    

    fclose(inputFile);
    fclose(outputFile);
    return 0;

【讨论】:

以上是关于C 编程,使用命令行参数从一个文件复制到另一个文件的主要内容,如果未能解决你的问题,请参考以下文章

QT下编程,有没有把文件从一路径下拷贝到另一路径下的函数,跪求

linux下用c语言写出复制黏贴文件

Linux基础操作:如何在 Linux 中复制文件夹?

编写一个程序,声明两个3行4列的二维数组,将其中一个数组初始化,再将此数组复制到另一个数组,最后分别

linux 怎样复制一个目录的所有文件到另一个目录

是否可以将ibm云功能从一个帐户复制到另一个帐户