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

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


/*
命令行参数中输入几个文件名,第一个文件名为要被目标文件名,后面的文件名为源文件名,把源文件附加到目标文件中
*/
#include
#include
#include
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;iif((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附加文件,就可以输出内容,请问问题出在哪里?

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);                  //修改
    }
}

while前 fseek( fa, 0, SEEK_SET ); 让文件游标回到文件开头。

合并完后,文件的读写位置因为追加写入,已经在文件尾部了,需要把它移动了文件起始位置。
用fseek