文件内容拷贝(1)文本方式-逐个字符拷贝(2)文本方式--逐行拷贝(3)二进制方式--逐块拷贝 (4)二进制方式-一次性拷贝

本文详细介绍了如何使用C++将文件内容以文本方式逐个字符、逐行字符串和二进制方式逐块拷贝到另一个文件。包括使用ifstream和ofstream流对象,以及关键函数如get(), put(), getline(), write()和gcount()的运用。

(1)文本方式-逐个字符拷贝

/*将一个文件的内容逐个字符拷贝进第二个文件*/

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
	ifstream inFile; //输入流对象
	ofstream outFile;  //输出流对象
	char ch;  //字符变量定义
	inFile.open("in.txt",ios::in); //将输入流对象和读入文件建立关联,以文本方式打开
	outFile.open("out.txt",ios::out);  //将输出流对象和输出文件建立关联
	//循环对读入文件逐个字符进行读入,然后写入到输出文件中
	while(inFile.get(ch))  //循环到读入EOF--文件结束标记	
		outFile.put(ch);  //逐个字符输出到输出文件
	inFile.close();  //关闭文件
	outFile.close();  //关闭文件
	cout<<"Copy  from  in.txt  fo  out.txt  Finish!"<<endl;
	system("pause");  //暂停
	return 0;
}




(2)文本方式--逐行拷贝

/*将一个文件的内容逐行字符串拷贝进第二个文件*/

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
	ifstream inFile; //输入流对象
	ofstream outFile;  //输出流对象
	char ch[200];  //字符数组
	inFile.open("in.txt",ios::in); //将输入流对象和读入文件建立关联,以文本方式打开
	outFile.open("out.txt",ios::out);  //将输出流对象和输出文件建立关联
	//循环对读入文件逐行字符串进行读入,然后写入到输出文件中
	while(!inFile.eof())  //循环读入每行直到遇到文件结束
	{ inFile.getline(ch,sizeof(ch),'\n');  
	  outFile.write(ch,strlen(ch));
	  outFile.write("\n",1);  //因为getline设置的是遇到回车结束,因此'\n'读不进来,因此需要在输出ch后,再输出一个'\n'来表示行结束
	 //outFile<<ch<<'\n';可替代上两句
	}
	inFile.close();  //关闭文件
	outFile.close();  //关闭文件
	cout<<"Copy  from  in.txt  fo  out.txt  Finish!"<<endl;
	system("pause");  //暂停
	return 0;
}


(3)二进制方式--逐块拷贝

/*将一个文件的内容以二进制方式逐块拷贝到第二个文件

注意:要考虑最后一次读取块的情况,因为最后一次块读取时,真实读取的大小可能会小于希望读取的大小。

read( )函数
     从流中读取字符串的成员函数read 
     该成员函数一般形式是:	read(char* pch, int nCount)
	从输入流中读取nCount个字符。
	当输入流中的字符数小于nCount时,结束读取。经常使用read函数读取二进制数据。

write( )函数
    成员函数write()输出一串字符。
	该成员函数一般形式是:write(char* pch, int nCount)
    其中,pch是指向字符数组的指针;nCount指明从第一个参数中复制输出字符的个数。

gcount( )函数
    输入流对象的成员函数,获取确定提取的字符数
	当程序从文件流中提取字符时,可能需要确切知道提取的字符数,可以使用gcount( )函数
    使用方式:输入流对象.gcount()
	

*/

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
	ifstream inFile; //输入流对象
	ofstream outFile;  //输出流对象
	char ch[200];  //字符数组
	long int size;
	inFile.open("in.txt",ios::in|ios::binary); //将输入流对象和读入文件建立关联,以二进制方式打开
	outFile.open("out.txt",ios::out|ios::binary);  //将输出流对象和输出文件建立关联,以二进制方式打开
	//循环对读入文件逐块进行读入,然后写入到输出文件中
	while(!inFile.eof())  //循环读入直到遇到文件结束
	{ inFile.read(ch,sizeof(ch)); //读取大小为 sizeof(ch)字节的数据存放到数组ch中
	  size=inFile.gcount(); //获取真实提取的字符数,最最后一次提取时,可能会出现size和sizeof(ch)的值不一致的情况
	  outFile.write(ch,size<sizeof(ch)?size:sizeof(ch)); 
	}
	inFile.close();  //关闭文件
	outFile.close();  //关闭文件
	cout<<"Copy  from  in.txt  fo  out.txt  Finish!"<<endl;
	system("pause");  //暂停
	return 0;
}

(4)二进制方式-一次性拷贝

/*将一个文件的内容以二进制方式一次性拷贝到第二个文件

注意:先获取文件大小,然后再动态创建内存空间来存放文件内容

read( )函数
     从流中读取字符串的成员函数read 
     该成员函数一般形式是:	read(char* pch, int nCount)
	从输入流中读取nCount个字符。
	当输入流中的字符数小于nCount时,结束读取。经常使用read函数读取二进制数据。

write( )函数
    成员函数write()输出一串字符。
	该成员函数一般形式是:write(char* pch, int nCount)
    其中,pch是指向字符数组的指针;nCount指明从第一个参数中复制输出字符的个数。

*/

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
	ifstream inFile; //输入流对象
	ofstream outFile;  //输出流对象
	char *buffer;  //字符指针
	long int size;
	inFile.open("in.txt",ios::in|ios::binary|ios::ate); //将输入流对象和读入文件建立关联,以二进制方式打开,并定位读指针为文件尾
	outFile.open("out.txt",ios::out|ios::binary);  //将输出流对象和输出文件建立关联,以二进制方式打开
	//循环对读入文件逐块进行读入,然后写入到输出文件中
    size=inFile.tellg();
	cout<<size<<endl;
	buffer=new char[size]; //动态开辟空间,以便存放要读取的文件内容
	inFile.seekg(0,ios::beg); //将读指针重新定位到文件开头
	inFile.read(buffer,size); //读取大小为 sizeof(ch)字节的数据存放到数组ch中
    outFile.write(buffer,size); 
    delete [] buffer;
	inFile.close();  //关闭文件
	outFile.close();  //关闭文件
	cout<<"Copy  from  in.txt  fo  out.txt  Finish!"<<endl;
	system("pause");  //暂停
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值