如何用fstream实现文件的逐块拷贝?
ifstream fin("src.txt");
ofstream fout("tgt.txt");
char buf[4096];
while (fin.read(buf, 4096))
{
fout.write(buf, 4096);
}
fin.close();
fout.close();
这个程序肯定不行
那么如何知道fin.read()实际读了多少字节呢?
问题点数:0、回复次数:8Top
1 楼6spring(6Spring)回复于 2005-06-01 20:38:40 得分 0
说个简单思路
获得文件size,然后读取filesize/bufsize次,最后一次读剩余部分(filesize%bufsize)Top
2 楼ufouser(ufouser)回复于 2005-06-01 20:48:19 得分 0
这个我也会
我就是想求一下能不能知道read实际上读了多少字节Top
3 楼mostideal(三甲)回复于 2005-06-02 00:25:35 得分 0
dingTop
4 楼ufouser(ufouser)回复于 2005-06-02 00:32:37 得分 0
按照 6spring(6Spring) 的提示写了个简单程序, 结果又引起了另外一个问题
/*
in.txt在windows中显示的大小是13字节,
但逐个读取(用fin.get())时只能读到11字节
这个11和13分别是怎么来的?
怎么才能在程序中得到11而不是13呢?
in.txt内容如下(最后的i的后面没有换行)
abc
def
ghi
*/
ifstream fin("in.txt");
ofstream fout("out.txt");
const int N = 256; // 缓冲区大小
char buf[N]; // 缓冲区
fin.seekg(0, ios::end); // 读指针移到文件尾
int nFileSize = fin.tellg(); // 取文件大小, = 13
int nRemain = nFileSize; // 记录还剩余多少字节没读
fin.seekg(0, ios::beg); // 读指针移到文件头
// 开始成块读取并发送
while (nRemain > 0)
{
int nCount = 0; // 保存当前块的大小
if (nRemain < N) { // 未处理字节数不足N
nCount = nRemain;
nRemain = 0;
}
else { // 未处理字节数大于等于N
nCount = N;
nRemain -= N;
}
fin.read(buf, nCount); // 读入
fout.write(buf, nCount);// 写出
}
fin.close();
fout.close();
/*
结果out.txt如下
abc
def
ghi烫
*/
即out.txt 比in.txt多了两个字节
用这个方法处理其他格式的文件(我用.mp3试的)时也是如此, 拷贝后文件大于原来的文件
如何处理这个问题呢? 或者说最关键的, 如何得到文件的"能让我们读的真实大小"(比如上面的11而不是13)Top
5 楼ufouser(ufouser)回复于 2005-06-02 00:48:11 得分 0
我晕, 忘了加ios::binary了
Top
6 楼zdy_8212(zdy_8212)回复于 2005-06-02 03:02:12 得分 0
那不就得析出控制符了吗?Top
7 楼someone(阿风)回复于 2005-07-27 16:10:16 得分 0
fin.read()之后用fin.gcount()就可知道读出的有效数据是多少。Top
8 楼someone(阿风)回复于 2005-07-27 16:14:22 得分 0
ifstream fin("src.txt");
ofstream fout("tgt.txt");
char buf[4096];
while (fin.read(buf, 4096))
{
fout.write(buf, fin.gcount());
}
fin.close();
fout.close();Top




