我写这篇文章是为了尝试基于命令行参数将一个文本文件的内容复制到另一个:
#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
循环的外观来看,很难发现这个错误。
您的代码中存在以下几个问题:
- 对于流,你不应该在end或eof上循环(看看关于这一点的许多SO问题/答案)
- Marcus透露的附带
{}
问题 - 您读取的不是行,而是单词(运算符>>使用空格作为分隔符),并压缩输出中的空白
以下是如何解决这一切:
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;
}