用c语言复制文本文件的内容
我想读取一个文本文件并将其内容传输到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
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、文件*流)
功能