[英]Copying a file with streams in C++
我写此文件的目的是根据命令行参数将一个文本文件的内容复制到另一个文件中:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char* argv[]) {
if(argc != 3) {
cout << "invalid args!";
return 0;
}
fstream op(argv[1], ios::in);
vector<string> list;
string line;
while(!op.end)
op >> line;
list.push_back(line);
op.close();
op.open(argv[2], ios::out);
for(unsigned int i = 0; i < list.size(); i++)
op << list[i];
op.close();
return 0;
}
它不会产生任何语法错误,但是会出现逻辑错误:没有输出。
因此,除了缺乏错误检查以及存在更有效的方法来执行此操作外,我的代码有什么问题? 也就是说, 为什么不将名称为argv[1]
的文件复制到名为argv[2]
的文件中?
您有一个错误: while
循环的主体未包含在{}
,因此仅执行op >> line
,直到完全读取文件为止,然后将line
的最后一个值压入向量中。
编辑:顺便说一句,这很好地说明了为什么应该让您的编辑器执行代码缩进; 从while
循环的外观来看,很难发现此错误。
您的代码中存在几个问题:
{}
所附问题 这里是如何解决所有这些问题的方法:
while(getline(op, line))
list.push_back(line);
当然是输出: op << list[i]<<endl;
对于一对一副本,您还可以考虑以下代码-处理二进制数据,使用更少的内存并且更短:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
using namespace std;
int main(int argc, char *argv[])
{
if (argc < 3)
return 1;
fstream s(argv[1], ios::in);
fstream d(argv[2], ios::out);
copy(
istreambuf_iterator<char>(s)
, istreambuf_iterator<char>()
, ostreambuf_iterator<char>(d));
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.