在 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 被执行直到文件被完全读取,并且 op >> line 的最后一个值=13=] 然后被推到向量上。

编辑:顺便说一句,这很好地说明了为什么您应该让您的编辑器执行您的代码缩进;你的 while 循环看起来很难发现这个错误。

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

  • 对于流,您不应在 end 或 eof 上循环(查看有关此的许多 SO questions/answers)。
  • 马库斯透露的封闭 {} 问题
  • 您不是在阅读行,而是在阅读单词(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;
}