首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

C执行cp
EN

Stack Overflow用户
提问于 2016-12-14 11:46:19
回答 1查看 1.1K关注 0票数 0

这是cp的一个原始实现,我在Linux机器(Ubuntu)上编译并运行了它,这段代码适用于任意大小的文本文件,但对于pdfs或mp3,我不知道有什么问题。我用EOF的方式错了吗?它编译和运行没有错误,但并不适用于每种类型的文件。

代码语言:javascript
运行
复制
 #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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-14 12:59:39

我用EOF的方式错了吗?

这是错误的。EOFint型的。fgetc的返回值也是int类型。将值存储在char中。

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

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

另一个错误是NUL-terminate char_buff时可能存在缓冲区溢出。如果文件的偶数为256个,那么当您添加i -terminator并在缓冲区外写入时,NUL将是-terminator。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41141808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档