【问题标题】:Working with files - replacing one line处理文件 - 替换一行
【发布时间】:2013-06-09 15:42:17
【问题描述】:

我正在尝试覆盖文件的行并取出单词“hello”。由于某种原因,这不起作用。这是文件:

out.txt

你好
1
2
再见

以下是错误:

错误:没有匹配函数调用'std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>::istream_iterator(std::fstream)'|

#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>

int main()
{
    std::copy_if(
        std::istream_iterator<std::string>(std::fstream("out.txt")),
        std::istream_iterator<std::string>(),
        std::istream_iterator<std::string>(std::fstream("out.txt")),
        [] (std::string str) { return str != "hello"; }
    );
}

【问题讨论】:

  • 在您仍在尝试读取文件时覆盖文件可能是个坏主意。当您实际上需要一些 output 迭代器时,您还可以传入 std::istream_iterator&lt;&gt; 作为第三个参数。

标签: c++ c++11 fstream


【解决方案1】:

查看std::istream_iterator 的可用构造函数:

istream_iterator();
constexpr istream_iterator();
istream_iterator( istream_type& stream );
istream_iterator( const istream_iterator& other ) = default;

你试图调用第三个构造函数,但是你传递了一个 rvalue,而 lvalie 是预期的。

【讨论】:

  • 那么我该如何让它工作呢?你能给我新程序吗?
  • @MemyselfandI, 1) 不要传递临时的fstream 对象,只在调用函数之前声明它,2) 创建两个对象(ifstreamofstream,不是同一个文件),和替换std::ostream_iterator 的第三个参数。此外,您可以将分隔符作为第二个参数传递,例如:std::ostream_iterator(fout, "\n")
  • 好的,当我使用两个不同的文件(用于输入和输出)时它可以工作,但是我怎样才能让它替换 same 文件中的行?
  • 写完就不能移动/重命名文件吗?
  • 你可以使用std::rename函数。
猜你喜欢
  • 1970-01-01
  • 2015-11-22
  • 2016-05-15
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
相关资源
最近更新 更多