用c语言复制文本文件的内容

用c语言复制文本文件的内容,c,file-io,standard-library,C,File Io,Standard Library,我想读取一个文本文件并将其内容传输到c语言中的另一个文本文件,以下是我的代码: char buffer[100]; FILE* rfile=fopen ("myfile.txt","r+"); if(rfile==NULL) { printf("couldn't open File...\n"); } fsee

我想读取一个文本文件并将其内容传输到c语言中的另一个文本文件,以下是我的代码:

             char buffer[100]; 

             FILE*  rfile=fopen ("myfile.txt","r+");
             if(rfile==NULL)
            {
              printf("couldn't open File...\n");
            }


            fseek(rfile, 0, SEEK_END);
            size_t file_size = ftell(rfile);
            printf("%d\n",file_size);
            fseek(rfile,0,SEEK_SET);
            fread(buffer,file_size,1,rfile);


            FILE* pFile = fopen ( "newfile.txt" , "w+" );
            fwrite (buffer , 1 ,sizeof(buffer) , pFile );
            fclose(rfile);
            fclose (pFile);
            return 0;
          } 
我面临的问题是接收文件中出现了不必要的数据,
我用“sizeof(buffer)”和“file_size”尝试了fwrite函数,在第一种情况下,它显示了更多的无用字符,而在第二种情况下,无用字符的数量只有3,如果有人指出我的错误并告诉我如何去除这些无用字符,我将不胜感激。

您需要检查所有调用
fseek()
fread()
fwrite()
,甚至
fclose()
的返回值


在您的示例中,您有一个100字节长的
fread()
read 1块。反转参数通常是一个更好的主意,如下所示:
ret=fread(缓冲区,1,文件大小,rfile)
。然后,
ret
值将显示它可以读取多少字节,而不仅仅是说它无法读取整个块。

您需要检查所有调用
fseek()
fread()
fwrite()
,甚至
fclose()
的返回值


在您的示例中,您有一个100字节长的
fread()
read 1块。反转参数通常是一个更好的主意,如下所示:
ret=fread(缓冲区,1,文件大小,rfile)
。然后,
ret
值将显示它可以读取多少字节,而不仅仅是说它无法读取完整的块。

您正在将
缓冲区的所有内容写入接收文件中(100个字符)。您需要写入读取的确切数据量

fwrite(buffer, 1, file_size, pFile)
为代码添加更多检查:

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

#define BUFFER_SIZE   100

int main(void) {
    char buffer[BUFFER_SIZE]; 
    size_t file_size;
    size_t ret;

    FILE* rfile = fopen("input.txt","r+");
    if(rfile==NULL)
    {
      printf("couldn't open File \n");
      return 0;
    }

    fseek(rfile, 0, SEEK_END);
    file_size = ftell(rfile);
    fseek(rfile,0,SEEK_SET);

    printf("File size: %d\n",file_size);

    if(!file_size) {
        printf("Warring! Empty input file!\n");
    } else if( file_size >= BUFFER_SIZE ){
        printf("Warring! File size greater than %d. File will be truncated!\n", BUFFER_SIZE);
        file_size = BUFFER_SIZE;
    }

    ret = fread(buffer, sizeof(char), file_size, rfile);
    if(file_size != ret) {
        printf("I/O error\n");
    } else {
        FILE* pFile = fopen ( "newfile.txt" , "w+" );
        if(!pFile) {
            printf("Can not create the destination file\n");
        } else {
            ret = fwrite (buffer , 1 ,file_size , pFile );
            if(ret != file_size) {
                printf("Writing error!");
            }
            fclose (pFile);
        }
    }
    fclose(rfile);
    return 0;
}
#包括
#包括
#定义缓冲区大小为100
内部主(空){
字符缓冲区[缓冲区大小];
大小文件大小;
尺寸(单位);;
FILE*rfile=fopen(“input.txt”、“r+”);
if(rfile==NULL)
{
printf(“无法打开文件\n”);
返回0;
}
fseek(rfile,0,SEEK_END);
文件大小=ftell(rfile);
fseek(rfile,0,SEEK_SET);
printf(“文件大小:%d\n”,文件大小);
如果(!文件大小){
printf(“文件!空输入文件!\n”);
}else if(文件大小>=缓冲区大小){
printf(“文件大小大于%d。文件将被截断!\n”,缓冲区大小);
文件大小=缓冲区大小;
}
ret=fread(缓冲区,大小(字符),文件大小,rfile);
if(文件大小!=ret){
printf(“I/O错误\n”);
}否则{
FILE*pFile=fopen(“newfile.txt”、“w+”);
如果(!pFile){
printf(“无法创建目标文件\n”);
}否则{
ret=fwrite(缓冲区,1,文件大小,pFile);
if(ret!=文件大小){
printf(“写入错误!”);
}
fclose(pFile);
}
}
fclose(rfile);
返回0;
}

您正在将
缓冲区的所有内容写入接收文件中。您需要写入读取的确切数据量

fwrite(buffer, 1, file_size, pFile)
为代码添加更多检查:

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

#define BUFFER_SIZE   100

int main(void) {
    char buffer[BUFFER_SIZE]; 
    size_t file_size;
    size_t ret;

    FILE* rfile = fopen("input.txt","r+");
    if(rfile==NULL)
    {
      printf("couldn't open File \n");
      return 0;
    }

    fseek(rfile, 0, SEEK_END);
    file_size = ftell(rfile);
    fseek(rfile,0,SEEK_SET);

    printf("File size: %d\n",file_size);

    if(!file_size) {
        printf("Warring! Empty input file!\n");
    } else if( file_size >= BUFFER_SIZE ){
        printf("Warring! File size greater than %d. File will be truncated!\n", BUFFER_SIZE);
        file_size = BUFFER_SIZE;
    }

    ret = fread(buffer, sizeof(char), file_size, rfile);
    if(file_size != ret) {
        printf("I/O error\n");
    } else {
        FILE* pFile = fopen ( "newfile.txt" , "w+" );
        if(!pFile) {
            printf("Can not create the destination file\n");
        } else {
            ret = fwrite (buffer , 1 ,file_size , pFile );
            if(ret != file_size) {
                printf("Writing error!");
            }
            fclose (pFile);
        }
    }
    fclose(rfile);
    return 0;
}
#包括
#包括
#定义缓冲区大小为100
内部主(空){
字符缓冲区[缓冲区大小];
大小文件大小;
尺寸(单位);;
FILE*rfile=fopen(“input.txt”、“r+”);
if(rfile==NULL)
{
printf(“无法打开文件\n”);
返回0;
}
fseek(rfile,0,SEEK_END);
文件大小=ftell(rfile);
fseek(rfile,0,SEEK_SET);
printf(“文件大小:%d\n”,文件大小);
如果(!文件大小){
printf(“文件!空输入文件!\n”);
}else if(文件大小>=缓冲区大小){
printf(“文件大小大于%d。文件将被截断!\n”,缓冲区大小);
文件大小=缓冲区大小;
}
ret=fread(缓冲区,大小(字符),文件大小,rfile);
if(文件大小!=ret){
printf(“I/O错误\n”);
}否则{
FILE*pFile=fopen(“newfile.txt”、“w+”);
如果(!pFile){
printf(“无法创建目标文件\n”);
}否则{
ret=fwrite(缓冲区,1,文件大小,pFile);
if(ret!=文件大小){
printf(“写入错误!”);
}
fclose(pFile);
}
}
fclose(rfile);
返回0;
}

注意
ftell
返回的是
long
,而不是
size\u t
。不过,这不重要<不过,code>ftell本身不一定是字节偏移量。标准只要求它是
fseek
可接受的参数。通过
fgetpos
,您可能会得到更好的结果,但由于缺乏标准的规范,它也存在同样的可移植性问题。(坦白:我没有检查标准本身;所有这些都是从手册中获得的。)

获取文件大小的更可靠方法是使用
fstat

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd>

struct stat stat_buf;
if (fstat(filename, &buf) == -1)
    perror(filename), exit(EXIT_FAILURE);
file_size = statbuf.st_size;
#包括
#包括
#包括
结构统计;
if(fstat(文件名,&buf)=-1)
perror(文件名),exit(退出失败);
文件大小=statbuf.st大小;

注意
ftell
返回的是
long
,而不是
size\u t
。不过,这不重要<不过,code>ftell本身不一定是字节偏移量。标准只要求它是
fseek
可接受的参数。通过
fgetpos
,您可能会得到更好的结果,但由于缺乏标准的规范,它也存在同样的可移植性问题。(坦白:我没有检查标准本身;所有这些都是从手册中获得的。)

获取文件大小的更可靠方法是使用
fstat

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd>

struct stat stat_buf;
if (fstat(filename, &buf) == -1)
    perror(filename), exit(EXIT_FAILURE);
file_size = statbuf.st_size;
#包括
#包括
#包括
结构统计;
if(fstat(文件名,&buf)=-1)
perror(文件名),exit(退出失败);
文件大小=statbuf.st大小;

我认为您在fwrite中传递的参数顺序不正确

对我来说应该是这样的-

fwrite(缓冲区,大小,1,pFile)

因为fwrite的语法是 大小写入(const void*ptr、大小、大小nmemb、文件*流)

功能