2016-12-14 58 views
0

這是一個cp的原始實現,我編譯並在Linux機器上運行它(Ubuntu),這個代碼適用於任何大小的文本文件,但不適用於pdf或mp3,我不知道im dong錯誤。我使用EOF的方式錯了嗎?它編譯和運行沒有錯誤,但不適用於每種文件。cp執行cp

#include<stdio.h> 
#include<stdlib.h> 
#include <string.h> 

#define MAX_SIZE 2 
#define MAX_BUF_SIZE 256 

int main(int argc, char* argv[]) 
{ 
    FILE *pFile_src=NULL; 
    FILE *pFile_dest=NULL; 

    char* mychar; 
    char *SRC, *DEST; 
    int i=0,j; 

    char char_buff[MAX_BUF_SIZE]; 
    mychar= (char *)malloc(sizeof(char *)); 

    if(argv[1]!=NULL) 
     SRC=argv[1]; 
    else 
     printf("\nUSAGE: ./Ex_ManualCP_prog src_file dest_file.\nFirst arg should be a filename, cannot be empty.\n"); 

    if(argv[2]!=NULL) 
     DEST=argv[2]; 
    else 
     printf("\nSecond arg should be a filename, cannot be empty.\n"); 

    mychar= (char *)malloc(MAX_SIZE*sizeof(char *)); 

    //initialize text buffer 
    for(j=0;j<MAX_BUF_SIZE;j++) 
     char_buff[j]='\0'; 

    pFile_src=fopen(SRC,"r");  //Open file to read and store in a character buffer 

    pFile_dest=fopen(DEST,"w"); //open destination file 

    if(pFile_dest==NULL) 
     printf("\nFile specified as Destination DOES NOT EXIST.\n"); 

    if(pFile_src==NULL) 
     printf("\nFile specified as Source, DOES NOT EXIST.\n"); 
    else 
    { 
    //printf("\n----File opened successfully-----\n"); 

     while(((*mychar=fgetc(pFile_src))!=EOF)) 
     { 
      if(i>=MAX_BUF_SIZE) 
      { 
       i=0; 
      } 

      char_buff[i]=*mychar; 
      fputc(char_buff[i],pFile_dest); //write buffer data into opened file 
      ++i; 
     } 

     char_buff[i]='\0'; 
     fclose(pFile_src); //close source file 

    } 

    fclose(pFile_dest); 

    if(pFile_src!=NULL && pFile_dest!=NULL) 
     printf("\n\n-----Copy Done!----\n-----Reached end of file.-----\n"); 

return 0; 
} 
+1

打開帶有標誌的文件:「rb」,並寫入:「wb」,這應該解決問題。 –

+1

根據fopen的手冊頁,標誌「b」應該沒有效果。 – Jerry

+0

@sonukumar謝謝,但它並沒有改變一件事。 –

回答

1

是不是錯了,我EOF使用的方法是什麼?

這是錯誤的。 EOFint的類型。 fgetc的返回值也是int。您將該值存儲在char中。

如果文件包含值爲-1/255的任何字節,則您的代碼將失敗。當然,文本文件不會,但是大的二進制文件可能包含這樣的字節。

mychar的類型更改爲int將解決該問題。

另一個問題是當你NUL -terminate char_buff可能的緩衝區溢出。如果文件是256的偶數,那麼當添加NUL -terminator時,i將爲 256,並且您將寫入緩衝區之外。

+0

非常感謝你,我把'mychar'改爲int,並且當我把它作爲'char_buf'數組中的一個字符接受時進行了一個類型轉換。我監督了'fgetc'的返回類型。 aweswome! –