我想使用不同的名称多次复制文件。
该计划是这样的:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include <sstream>
#include<cstring>
using namespace std;
main()
{
string text;
int i;
char ch;
ostringstream oss;
FILE *fp1,*fp2;
if((fp1=fopen("One Dollar.jpg", "rb"))==NULL)
{
cout<<"Error";
exit(-1);
}
for(i=1; i<=5; i++)
{
oss << "C:\\5241 Dollar\\One Dollar " << i << ".jpg";
text = oss.str();
if((fp2=fopen(text.c_str(), "wb"))==NULL)
{
cout<<"Error "<<i;
exit(-1);
}
while(!feof(fp1))
{
fread(&ch, 1, 1, fp1);
fwrite(&ch, 1, 1, fp2);
}
fclose(fp2);
/* for(int j=0;j<30000;j++)
for(int k=0;k<30000;k++)
if(k==3000)
cout<<k; */
}
fclose(fp1);
}
在这里有两个文件流,其中一个是源,另一个是目的地..我以二进制读取模式加载实际文件,目标作为二进制写入模式。我使用for循环来完成工作。但是一旦循环迭代第二次,fp2的文件打开就会失败。我得到了输出:错误2。
如何使代码生效?
答案 0 :(得分:3)
您应该在循环的每次迭代中打开和关闭第一个文件。
....
for(i=1; i<=5; i++)
{
if((fp1=fopen("One Dollar.jpg", "rb"))==NULL)
{
cout<<"Error";
exit(-1);
}
....
原因是因为在第一次迭代结束时,第一个文件指针位于文件的末尾,因此在第二次迭代时不会看到任何数据。你必须关闭并重新打开文件(或者你可以使用seek
跳转到文件的前面,但这是一个更简单的更改,因为它是复制粘贴的)
编辑:对新问题:
你需要重置stringstream。在第二次迭代中,您尝试打开
C:\\5241 Dollar\\One Dollar 1.jpgC:\\5241 Dollar\\One Dollar 2.jpg
无效。
一种解决方案是将ostringstream声明带入循环:
....
for(i=1; i<=5; i++)
{
if((fp1=fopen("One Dollar.jpg", "rb"))==NULL)
{
cout<<"Error";
exit(-1);
}
ostringstream oss;
oss << "C:\\5241 Dollar\\One Dollar " << i << ".jpg";
答案 1 :(得分:0)
fill_parent