c++ 读取文件 后文件变小了(fstream)
path="abc.mp3";//22Mdes="./copyabc.mp3";//charcBuffer[1024];ifstreamiFile;//源ofstream...
path="abc.mp3"; //22M
des = "./copyabc.mp3";//
char cBuffer[1024];
ifstream iFile;//源
ofstream oFile;//目标
iFile.open(path,ios::in | ios::binary);//二进制打开,读
oFile.open(dest,ios::out | ios::binary);//二进制打开,写
iFile.seekg(0);
oFile.seekp(0);
while(!iFile.eof()) {//循环读入数据
memset(cBuffer,0,sizeof(cBuffer)-1);
iFile.read(cBuffer,sizeof(cBuffer));
oFile.write(cBuffer,strlen(cBuffer));
}
读完后。copyabc.mp3大小只有4M多,比原文件少了4/5,也不能播放了 展开
des = "./copyabc.mp3";//
char cBuffer[1024];
ifstream iFile;//源
ofstream oFile;//目标
iFile.open(path,ios::in | ios::binary);//二进制打开,读
oFile.open(dest,ios::out | ios::binary);//二进制打开,写
iFile.seekg(0);
oFile.seekp(0);
while(!iFile.eof()) {//循环读入数据
memset(cBuffer,0,sizeof(cBuffer)-1);
iFile.read(cBuffer,sizeof(cBuffer));
oFile.write(cBuffer,strlen(cBuffer));
}
读完后。copyabc.mp3大小只有4M多,比原文件少了4/5,也不能播放了 展开
2个回答
展开全部
不要用strlen来判断写入数据的大小,strlen是用于计算字符串长度的,遇到'\0'就会返回。
而你读取的音频是二进制文件,不是纯文本,数据中很可能存在'\0',会导致strlen不能正确计算buffer的长度。
read函数会返回读取的字节长度,如下:
int len = iFile.read(cBuffer,sizeof(cBuffer));
oFile.write(cBuffer,len);
此外,这里的memset没有作用,可以省略。
要注意的是,在处理的非文本的二进制流时,虽然是char数组,但是最好不要使用字符串相关的库函数,如strcpy, strlen等,它们都是需要'\0'来判断字符串结尾的。
而你读取的音频是二进制文件,不是纯文本,数据中很可能存在'\0',会导致strlen不能正确计算buffer的长度。
read函数会返回读取的字节长度,如下:
int len = iFile.read(cBuffer,sizeof(cBuffer));
oFile.write(cBuffer,len);
此外,这里的memset没有作用,可以省略。
要注意的是,在处理的非文本的二进制流时,虽然是char数组,但是最好不要使用字符串相关的库函数,如strcpy, strlen等,它们都是需要'\0'来判断字符串结尾的。
追问
'initializing' : cannot convert from 'class std::basic_istream >' to 'int'
追答
非常抱歉,我是以普通read函数来理解的,没想到ifstream的read方法返回的不是读取长度。
iFile.read需要手动控制长度,也就是说调用的时候不能都用sizeof(cBuffer)。
可以试试这样:
// get length of file:
iFile.seekg (0, ios::end);
int total = is.tellg();
iFile.seekg (0, ios::beg);
while(!iFile.eof()) {//循环读入数据
int count = sizeof(cBuffer) < total ? sizeof(cBuffer) : total;
iFile.read(cBuffer, count);
oFile.write(cBuffer, count);
total -= count;
}
参考资料: http://www.cplusplus.com/reference/iostream/istream/read/
展开全部
修改此处:
去掉memset
int n = iFile.read(cBuffer,sizeof(cBuffer)); // 你确定读取后字符串自动加'\0'了?
oFile.write(cBuffer,n);
去掉memset
int n = iFile.read(cBuffer,sizeof(cBuffer)); // 你确定读取后字符串自动加'\0'了?
oFile.write(cBuffer,n);
追问
'initializing' : cannot convert from 'class std::basic_istream >' to 'int‘’返回的不像是int型,inline啥玩意儿
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询