2013-07-30 73 views
0
/*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()?

我哪裏錯了?

File being viewed in gvim

我不知道爲什麼調整這麼多。

+1

'gets'將被廢除。 – BLUEPIXY

+0

可能太元,但'strcmp'不是測試輸入文件是否與輸出文件相同的好方法。練習:你能說出一個或多個原因嗎? – usr2564301

+0

請注意,你不應該使用'gets()'函數,這從根本上是不安全的。這個函數在C99中被棄用,完全被C11忽略。 –

回答

9
while(bytes = (fread(buffer, sizeof(char), BUFSIZE, src)) > 0) 
    fwrite(buffer, sizeof(char), BUFSIZE, mainfile); 

應該

while((bytes = fread(buffer, sizeof(char), BUFSIZE, src)) > 0) 
    fwrite(buffer, sizeof(char), bytes, mainfile); 

在不到BUFSIZE字節fread回報,你從以前的寫數據讀入mainfile案件。

您還可以檢查fwrite是否返回bytes,選擇是否放棄或重試寫入緩衝區的其餘部分(如果寫入較少)。

+1

我想你的意思是:'while((bytes = fread(buffer,sizeof(char),BUFSIZE,src))> 0)',left'('bytes ='**?' –

+1

哦,天啊,你'沒錯,當緩衝區沒有滿時,我仍然在寫BUFSIZE字節,而不是實際讀取的數量。 –

+1

@GrijeshChauhan謝謝,我錯過了,現在添加到我的答案中。 – simonc