cp的C实现

C implementation of cp

这是 cp 的原始实现,我在 Linux 机器 (Ubuntu) 上编译并 运行 它,此代码适用于任何大小的文本文件,但不适用于pdf 或 mp3,我不知道我哪里错了。我使用 EOF 的方式不对吗?它编译和运行没有错误,但不适用于所有类型的文件。

 #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]='[=10=]';

  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]='[=10=]';
       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;
}

Is it wrong the way i use EOF?

这是错误的。 EOFint 类型。 fgetc 的 return 值也是 int 类型。您将值存储在 char.

如果文件包含任何值为 -1/255 的字节,您的代码将失败。文本文件当然不会,但大型二进制文件可能包含此类字节。

mychar 的类型更改为 int 将解决该问题。

另一个错误是当您 NUL 终止 char_buff 时可能的缓冲区溢出。如果文件是 256 的偶数倍,则 i 将是 256 当您添加 NUL 终止符时,您将在缓冲区外写入​​。