【问题标题】:Merging a list of files into another将文件列表合并到另一个文件中
【发布时间】:2016-10-27 14:30:17
【问题描述】:

我正在尝试制作一个程序来获取一系列文件并将它们复制到另一个文件中。

例如

./foobar arch1.txt arch2.txt arch3.txt

必须用arch1.txt、arch2.txt、archN.txt的内容创建arch3.txt。

这是我的代码:

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


void usage (char *argv[], int code)
{
    printf("usage: %s [<file> <out_file>] \n", argv[0]);
    exit(code);
}

void copyFile (FILE *ifp, FILE *ofp)
{
    int c;

    while ((c = fgetc(ifp)) != EOF) 
        fputc(c, ofp);
}

int main(int argc, char *argv[])
{
    system ("clear");

    FILE *fp, *fp2;

    if (argc < 3)
        usage(argv, EXIT_FAILURE);
    else
        if ((fp2 = fopen(argv[argc-1], "w")) == NULL) {
                    printf("Can't open file to write: %s\n", *argv);
                    exit(EXIT_FAILURE);
            }
        while(--argc > 0)
            printf("%d",argc);
            if ((fp = fopen(*++argv, "r")) == NULL) {
                printf("Can't open file: %s\n", *argv);
                exit(EXIT_FAILURE);
            }
            else {
                copyFile(fp, fp2);
                fclose(fp);
                fclose(fp2);    
            }
        return 0;
}

我的输出:

无法打开要写入的文件:./foobar

【问题讨论】:

标签: c fopen fclose fgetc


【解决方案1】:

那是因为您在 fopen() 中使用 *argv 作为文件名参数。它应该是 argv[argc - 1]。

【讨论】:

  • 代码向前迭代,所以你想从-argv[1]开始,或者给定迭代方法,只需在调用fopen()之前放置argv++
【解决方案2】:

*argv 不是第一个参数,而是可执行文件的路径。

在直接使用之前将argv递增一次:

    argv++ ;
    if ((fp2 = fopen(argv[argc-1], "w")) == NULL) {

或者也许更好地使用数组索引并从argv[1]开始。

【讨论】:

    【解决方案3】:

    我修好了。它不漂亮,但现在可以使用。

    #include <stdio.h>
    #include <stdlib.h>
    
    void usage (char *argv[], int code)
    {
        printf("usage: %s [<file> <out_file>] \n", argv[0]);
        exit(code);
    }
    
    void copyFile (FILE *ifp, FILE *ofp)
    {
        int c;
    
        while ((c = fgetc(ifp)) != EOF) 
            fputc(c, ofp);
    }
    
    int main(int argc, char *argv[])
    {
        FILE *f_read, *f_write;
    
        int i;
    
        if (argc < 3) 
            usage(argv, EXIT_FAILURE);
    
        if ((f_write = fopen(argv[argc-1], "w")) == NULL) {
            printf("Can't write in: %s\n", argv[argc-1]);
            exit(EXIT_FAILURE);
        }
    
        for (i = 1; i < argc-1; ++i)
        {
            if ((f_read = fopen(argv[i], "r")) == NULL) {
                    printf("Can't open file: %s\n", argv[i]);
                    exit(EXIT_FAILURE);
                }
                else
                    copyFile(f_read, f_write);
        }
        fclose(f_read);
        fclose(f_write);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 2018-08-13
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      相关资源
      最近更新 更多