/*Write a program that indefinitely takes in files to append to a master
file. If the file names are the same, don't do it. If there's an error,
don't do it. Exit with a blank line. Use a custom buffer.*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME 25
#define BUFSIZE 1024
int append(FILE *, FILE *);
int main(){
char src[MAX_NAME], mainfile[MAX_NAME];
FILE *src_ptr, *mainfile_ptr;
int successes = 0;
puts("Enter name of main file");
if(gets(mainfile) == NULL){
fprintf(stderr, "Error, couldn't get filename\n");
return 1;
}
if((mainfile_ptr = fopen(mainfile, "ab")) == NULL){
fprintf(stderr, "Error, couldn't open mainfile\n");
return 1;
}
do{
puts("Enter a filename to be appended");
if(gets(src) == NULL || src[0] == '\0' || strcmp(src, mainfile) == 0){
if(src[0])
puts("Error, couldn't get filename!");
continue;
}
if((src_ptr =fopen(src, "rb")) == NULL){
puts("Error, could not open file");
continue;
}
if(setvbuf(src_ptr, NULL, _IOFBF, BUFSIZE) != 0){
puts("Couldn't create filebuffer!");
continue;
}
if(append(src_ptr, mainfile_ptr) != 0){
fflush(src_ptr);
puts("Couldn't append!");
continue;
}
fclose(src_ptr);
++successes;
printf("Successfully appended %s, %d files total\n", src, successes);
}while(src[0] != '\0');
fclose(mainfile_ptr);
printf("Successfully appended %d files, bye!\n", successes);
return 0;
}
int append(FILE *src, FILE *mainfile){
size_t bytes = 0;
static char buffer[BUFSIZE];
while(bytes = (fread(buffer, sizeof(char), BUFSIZE, src)) > 0)
fwrite(buffer, sizeof(char), BUFSIZE, mainfile);
if(ferror(src) || ferror(mainfile))
return 1;
return 0;
}
你好。根據C Primer Plus示例,我編寫了一個程序,將 用戶指定文件的內容附加到主文件中。最初我寫它打算只用於 文本文件,但後來我改變它在二進制模式下工作。我用它來追加四個文件。我得到了一些非常奇怪的結果,我不知道爲什麼。下面是完成的 文件的屏幕截圖(我不得不截圖它,因爲它充滿了奇怪的字符)。我得到相同的 結果,而不用打開二進制模式打開它們。它似乎多次「追加」我的文件 ,其中一些只有一半,然後是另一半。如何在我的程序中正確使用fread()和fwrite()?
我哪裏錯了?
我不知道爲什麼調整這麼多。
'gets'將被廢除。 – BLUEPIXY
可能太元,但'strcmp'不是測試輸入文件是否與輸出文件相同的好方法。練習:你能說出一個或多個原因嗎? – usr2564301
請注意,你不應該使用'gets()'函數,這從根本上是不安全的。這個函數在C99中被棄用,完全被C11忽略。 –