簡體   English   中英

C 編程,使用命令行參數從一個文件復制到另一個文件

[英]C programming, copying from one file to another using command line arguments

這是我的代碼

#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

無法打開輸入文件file.txt :要么因為它不在當前目錄中,要么因為您沒有讀取權限。

您應該輸出更多信息豐富的錯誤消息。 還要注意這些問題:

  • if (!bufferSize || bufferSize < 1)是一個冗余測試。 if (bufferSize < 1)就足夠了。
  • 錯誤消息應該輸出到stderr
  • 文件應該以二進制模式打開,以可靠地復制舊系統上的所有文件類型。
  • 讀/寫循環不正確:嘗試將0元素寫入輸出文件之前,您應該在fread返回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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM