繁体   English   中英

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

[英]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循环的外观来看,很难发现此错误。

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

  • 使用流时,您将不会循环播放或结束播放(请查看有关此的许多SO问题/答案)。
  • 马库斯(Marcus)透露的{}所附问题
  • 您不是在阅读行,而是在阅读单词( operator >>使用空格作为分隔符)并在输出中对空格进行排序。

这里是如何解决所有这些问题的方法:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM