标签: istream-iterator

使用ifstream复制算法

以下代码的行为与我的预期不符.请帮我理解它是如何工作的.

#include <algorithm>
#include <iterator>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

struct user
{
        string name;
        string age;
        string id;
};

istream& operator>>(istream& is, user& s)
{
        getline(is, s.name, ':');
        getline(is, s.age, ':');
        getline(is, s.id);

        return is;
}

int main(int argc, char* argv[])
{
        ifstream file("file.txt");
        vector<user> vec;
        copy(istream_iterator<user>(file), istream_iterator<user>(), back_inserter(vec));

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的自定义运算符>>被调用两次,但我希望它只被调用一次因为内容是:

约翰:40:21-5821-0

c++ iterator istream-iterator ifstream stl-algorithm

6
推荐指数
1
解决办法
1244
查看次数

如何用libc ++ istream_iterator读取文件中的0xFF?

请考虑以下示例代码:

#include <iostream>

using namespace std;

int main()
{
  istreambuf_iterator<char> eos;
  istreambuf_iterator<char> iit(cin.rdbuf());
  int i;
  for (i = 0; iit != eos; ++i, ++iit) {
    cout << *iit;
  }
  cout << endl << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

以及包含以下内容的输入文件:"foo\xffbar":

$ hexdump testin
0000000 66 6f 6f ff 62 61 72
0000007
Run Code Online (Sandbox Code Playgroud)

现在使用clang libc ++ vs gnu libstdc ++进行测试:

$ make test
clang++ -std=c++11 -stdlib=libc++ -Wall -stdlib=libc++ -o bug-libcc bug.cpp
clang++ -std=c++11 -stdlib=libc++ -Wall -stdlib=libstdc++ -o bug-libstd bug.cpp
./bug-libcc < testin
foo …
Run Code Online (Sandbox Code Playgroud)

c++ istream-iterator libstdc++ libc++

5
推荐指数
1
解决办法
468
查看次数

将std :: ifstream读取到行向量后,有些字节丢失了

为了将我从输入文件中读取的内容复制到vector,我std::copy()按照将std :: ifstream读取到行向量的建议使用.

如果我使用以下问题会发生:

std::copy(std::istream_iterator<unsigned char>(inputfile),
          std::istream_iterator<unsigned char>(),
          std::back_inserter(myVector));
Run Code Online (Sandbox Code Playgroud)

myVector变量中缺少我文件的第16个字节.

但是,如果我使用以下代码:

inputfile.read((char*)&myVector[0], sizeof(int)*getfilesize(nameOfFile));
Run Code Online (Sandbox Code Playgroud)

然后该字节不再丢失.

我试图解析WAV文件,我在这上面浪费了太多时间,我希望我能从中学到新东西.你能否告诉我上面代码的第一个版本有什么问题?

c++ istream-iterator

5
推荐指数
2
解决办法
1341
查看次数

在 istream 上使用 regex_iterator

我希望能够解决这样的问题:Getting std::ifstream to handle LF, CR, and CRLF? 其中 anistream需要通过复杂的分隔符进行标记;这样标记化的唯一方法istream是:

  1. istream一次读取一个字符
  2. 收集角色
  3. 当命中分隔符时,将集合作为标记返回

正则表达式非常擅长用复杂的分隔符标记字符串:

string foo{ "A\nB\rC\n\r" };
vector<string> bar;

// This puts {"A", "B", "C"} into bar
transform(sregex_iterator(foo.cbegin(), foo.cend(), regex("(.*)(?:\n\r?|\r)")), sregex_iterator(), back_inserter(bar), [](const smatch& i){ return i[1].str(); });
Run Code Online (Sandbox Code Playgroud)

但我不能regex_iterator在 a 上使用 a istream:( 我的解决方案是吸食istream然后运行regex_iterator它,但吸食步骤似乎是多余的。

是否存在istream_iterator和 的邪恶组合regex_iterator,或者如果我想要它,我必须自己编写它吗?

c++ regex iterator istream-iterator istream

5
推荐指数
1
解决办法
1776
查看次数

Why I cannot create a stream iterator?

I am supposed to create a looks-like stream iterator class so that I can read from the input stream when incrmenting an object of my class.

I've done this:

template<class T>
struct istrm_it{
    istrm_it() = default;
    istrm_it(std::istream& in) :
        in_(in), val_(T()) {
        in_ >> val_;
    }
    T val_;
    std::istream& in_ = std::cin;
    istrm_it& operator++() { in >> val_; return *this; };
    istrm_it& operator++(int) { in_ >> val_; return *this; };
    T operator*() { return val_; }
    bool operator==(const istrm_it& rhs)const …
Run Code Online (Sandbox Code Playgroud)

c++ istream-iterator

5
推荐指数
1
解决办法
67
查看次数

我可以使用 istream_iterator&lt;char&gt; 将一些 istream 内容复制到 std::string 中吗?

我有一个istream并且需要将两个分隔符之间的内容复制到一个std::string. 我可以找到定界符' streampos,但是当尝试使用它istream_iterator<char>来遍历流的部分时,它不起作用。这是我尝试过的:

#include <iostream>
#include <sstream>
#include <iterator>


std::string copyToString( std::istream& is )
{
    is >> std::ws;

    auto someLength {10};

    std::istream_iterator<char> beg {is};

    is.seekg( someLength, std::ios::cur );

    //std::istream_iterator<char> end { is };
    std::istream_iterator<char> end { std::next(beg, someLength) };

    return std::string{ beg, end };
}




int main()
{
    std::stringstream ss;
    ss.str( "   { my string content  }" );

    std::cout << "\"" << copyToString( ss ) << "\"\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我预计输出长度为 10 个字符,但它只是 …

c++ stdstring istream-iterator istream input-iterator

5
推荐指数
1
解决办法
222
查看次数

为什么istream_iterator <string>(ifstream("test.txt"))会导致错误?

我试图编写一个代码来从名为"test.txt"的文件中读取字符串,并将字符串写入标准输出.以下代码效果很好:

 int main()
 {
     using namespace std;
     ifstream file("test.txt");
     copy(istream_iterator<string>(file), 
          istream_iterator<string>(), 
          ostream_iterator<string>(cout, " ")); 
 }
Run Code Online (Sandbox Code Playgroud)

但是,通过此修改,代码不再编译:

   int main()
   {
        using namespace std;
        copy(istream_iterator<string>(ifstream("test.txt")),  // <-- Error here
        istream_iterator<string>(), 
        ostream_iterator<string>(cout, " "));   
   }
Run Code Online (Sandbox Code Playgroud)

这个版本为什么不编译?

我使用的编译器是g ++ 4.6.2,错误如下:

ex11-16.cpp:16:65: error: no matching function for call to 'std::istream_iterator<std::basic_string<char> >::istream_iterator(std::ifstream)'
ex11-16.cpp:16:65: note: candidates are:
.../bits/stream_iterator.h:72:7: note: std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator(const std::istream_iterator<_Tp, _CharT, _Traits, _Dist>&) [with _Tp = std::basic_string<char>, _CharT = char, _Traits = std::char_traits<char>, _Dist = int, std::istream_iterator<_Tp, _CharT, _Traits, _Dist> = std::istream_iterator<std::basic_string<char> >] …
Run Code Online (Sandbox Code Playgroud)

c++ iostream istream-iterator ifstream

4
推荐指数
1
解决办法
1022
查看次数

在C++中,是否可以实现一个迭代器接口,其中提前使"current"元素无效?

我正在设计一个C++接口,允许用户迭代从文件解码的对象.这种解码过程有点慢.

我正在考虑这个迭代器接口,但我想避免任何不必要的副本,所以我在考虑(用户方):

for (const auto& object : file) {
    // you can access the members of `object` here
    std::cout << object.whatever() << std::endl;

    // you can copy `object` here
    myObjectCopy = object;

    // you CANNOT do this because `object` changes
    // as soon as the iterator advances
    myObjectPtr = &object;
}
Run Code Online (Sandbox Code Playgroud)

object 在前面的用法示例中,是对迭代器实例内部对象的引用.

这是错的吗?你会在这里建议其他什么惯用的接口?

我想过一个流接口(想想std::istream),但是AFAIK,读取数据的方法也会返回副本(它们提取字符).

c++ iterator api-design istream-iterator c++11

4
推荐指数
1
解决办法
210
查看次数

istream_iterator在读取字符时忽略EOF(Ctrl + D)

我正试图istream_iterator用来读取人物cin.我已经读过按Ctrl+ D发送一个EOF结束输入流的字符.不幸的是,它出了问题.这是我的代码:

#include <iterator>
int main()
{
  using namespace std;

  istream_iterator<char> it(cin), eos;
  while (it != eos) clog << *(it++);
}
Run Code Online (Sandbox Code Playgroud)

我正在运行它并键入:as df,然后按Ctrl+ D.它只输出asd没有最后一个f然后挂起等待输入.当我输入gh并再次按Ctrl+ D时,它会打印f最后的剩余部分和g下一个输入,但是再次没有最后一个输入h.当我最后按Ctrl+ D而不键入任何内容时,它会打印剩余的h和退出.

我期望它能够读取asdf和退出,因为我已经在第一个序列的末尾按了Ctrl+ D.

到达后为什么还在等待输入EOF?
为什么它不打印以前读过的最后一个字符EOF?
为什么只有当我按Ctrl+ D之前没有输入任何内容时才会退出?
这个循环如何改变以使其按照我期望的方式运行?(即在输入中获得Ctrl …

c++ cin istream-iterator istream eof

3
推荐指数
1
解决办法
1712
查看次数

我无法理解 std::istream_iterator 的用法

我无法理解下面的代码。

(来自https://www.boost.org/doc/libs/1_74_0/more/getting_started/unix-variants.html)

#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " " );
}
Run Code Online (Sandbox Code Playgroud)

该网页没有对代码进行任何解释。

我无法理解的是功能线std::for_each。

std::for_each定义如下。

template <class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn);
Run Code Online (Sandbox Code Playgroud)

所以first就是in(std::cin),last就是in(),就是function这个cout陈述。

谁能向我解释示例代码中的语法和含义first?last

迭代first器似乎是用初始值构造的,但是最后一个值std::cin有什么用呢?in()

我也无法理解该_1部分。

该程序输出3 …

c++ boost iterator istream-iterator

3
推荐指数
1
解决办法
1933
查看次数