我写这个是为了尝试根据命令行参数将一个文本文件的内容复制到另一个文本文件中:
#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]
的文件中?
答案 0 :(得分:3)
您有一个错误:while
循环的正文未包含在{}
中,因此只有op >> line
执行才会完全读取文件,并且{{1}的最后一个值然后将其推到矢量上。
编辑:顺便说一句,这是一个非常好的例子,说明为什么你应该让编辑器进行代码缩进;你的line
循环的样子,很难发现这个错误。
答案 1 :(得分:1)
您的代码中存在以下几个问题:
{}
问题以下是如何解决所有这些问题:
while(getline(op, line))
list.push_back(line);
当然还有输出:op << list[i]<<endl;
答案 2 :(得分:1)
对于一对一的副本,您还可以考虑以下代码 - 处理二进制数据,使用更少的内存并且更短:
#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;
}