为什么文件被附加成功了,但是遍历无法输出文件的内容呢?
/*
命令行参数中输入几个文件名,第一个文件名为要被目标文件名,后面的文件名为源文件名,把源文件附加到目标文件中
*/
#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