PP圆圆像河马 2023-04-19 11:40 采纳率: 66.7%
浏览 40
已结题

C 关于文件不能输出其内容

为什么文件被附加成功了,但是遍历无法输出文件的内容呢?


/*
命令行参数中输入几个文件名,第一个文件名为要被目标文件名,后面的文件名为源文件名,把源文件附加到目标文件中
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void append1(FILE *source,FILE * dest);

int main(int argc,char * argv[]){
    FILE *fa;
    FILE * fs;
    int files=0;
    int ch;

    if(argc<3){
        fprintf(stderr,"没有足够的文件参数\n");
        exit(EXIT_FAILURE);
    }

    if((fa=fopen(argv[1],"a+"))==NULL){
        fputs("目标文件不能写入\n",stderr);
        exit(EXIT_FAILURE);
    }

    for(int i=2;i<argc;i++){
        if((fs=fopen(argv[i],"r"))==NULL){
            fprintf(stderr,"源文件 %s 不能读\n",argv[i]);
            continue;
        }

        append1(fs,fa);
        files++;
        fclose(fs);
        printf("%d files appended\n",files);

    }

    while((ch=getc(fa))!=EOF){
        putchar(ch);
    }

    puts("\nover 了 ");
    fclose(fa);

    return 0;
}

void append1(FILE *source,FILE * dest){
    char temp;
    while((temp=getc(source))!=EOF){
        
        putc(temp,dest);
    }
}

输出的结果为:

1 files appended

over

请问这个问题出在哪里? 同样的条件下使用二进制IO附加文件,就可以输出内容,请问问题出在哪里?

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2023-04-19 12:36
    关注

    void append1(FILE *source,FILE * dest) 函数,fgetc和fputc本质上是函数,而getc和putc本质上是宏!整体修改如下:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    void append1(FILE* source, FILE* dest);
    
    int main(int argc, char* argv[]) {
        FILE* fa;
        FILE* fs;
        int files = 0;
        int ch;
    
        if (argc < 3) {
            fprintf(stderr, "没有足够的文件参数\n");
            exit(EXIT_FAILURE);
        }
    
        if ((fa = fopen(argv[1], "a+")) == NULL) {
            fputs("目标文件不能写入\n", stderr);
            exit(EXIT_FAILURE);
        }
    
        for (int i = 2; i < argc; i++) {
            if ((fs = fopen(argv[i], "r")) == NULL) {
                fprintf(stderr, "源文件 %s 不能读\n", argv[i]);
                continue;
            }
            append1(fs, fa);
            files++;
            fclose(fs);
            printf("%d files appended\n", files);
    
        }
        rewind(fa);                      // 修改
        while ((ch = fgetc(fa)) != EOF) { //修改
            putchar(ch);
        }
        puts("\nover 了 ");
        fclose(fa);
    
        return 0;
    }
    void append1(FILE* source, FILE* dest) {
        char temp;
        while ((temp = fgetc(source)) != EOF) { //修改
            fputc(temp, dest);                  //修改
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月19日
  • 已采纳回答 4月19日
  • 创建了问题 4月19日

悬赏问题

  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解