使用C ++中的流复制文件

时间:2015-02-07 15:40:39

标签: c++ file io stream

我写这个是为了尝试根据命令行参数将一个文本文件的内容复制到另一个文本文件中:

#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]的文件中?

3 个答案:

答案 0 :(得分:3)

您有一个错误:while循环的正文未包含在{}中,因此只有op >> line执行才会完全读取文件,并且{{1}的最后一个值然后将其推到矢量上。

编辑:顺便说一句,这是一个非常好的例子,说明为什么你应该让编辑器进行代码缩进;你的line循环的样子,很难发现这个错误。

答案 1 :(得分:1)

您的代码中存在以下几个问题:

  • 使用流,你不应该循环或eof(看看关于这个的许多SO问题/答案)。
  • Marcus透露的封闭式{}问题
  • 您不是在读行,而是单词(operator>>使用空格作为分隔符)并且缩小输出中的空格。

以下是如何解决所有这些问题:

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;
}