标签: istream-iterator

无法使用wistringstream实例化istring_iterator

我正在尝试使用此线程中找到的方法拆分字符串,但我正在尝试将其调整为wstring.但是,我偶然发现了一个奇怪的错误.检查代码:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

int main(void)
{
    wstring str(L"Börk börk");
    wistringstream iss(str);
    vector<wstring> tokens;
    copy(istream_iterator<wstring>(iss), // I GET THE ERROR HERE
         istream_iterator<wstring>(),
         back_inserter< vector<wstring> >(tokens));

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

确切的错误消息是:

error: no matching function for call to 'std::istream_iterator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, char, std::char_traits<char>, int>::istream_iterator(std::wistringstream&)'
Run Code Online (Sandbox Code Playgroud)

我认为它说它不能使用传递的实例化istream_iterator iss(这是一个w istringstream而不是istringstream).这是在使用XCode和GCC 4.2的Mac上.和AFAIK没有wistring_iterator或类似的东西.

当我使用非wstring版本时它完美地工作.正如您可能看到我已经更改了要使用的声明wstring,wistringstreams和vector<wstring>,只是将所有内容替换为使用宽版本.

什么可能导致这个,为什么它不接受wstring-version?

c++ istream-iterator wstring

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

对`std :: istreambuf_iterator`的使用感到困惑

我已经使用<<stream运算符为对象实现了反序列化例程.例程本身使用an istreambuf_iterator<char>逐个从流中提取字符,以构造对象.

最终,我的目标是能够使用a迭代流istream_iterator<MyObject>并将每个对象插入到vector.漂亮的标准,除了我遇到麻烦istream_iterator,以停止时,如果击中结束流迭代.现在,它只是永远循环,即使调用istream::tellg()表明我在文件的末尾.

这是重现问题的代码:

struct Foo
{
    Foo() { }    
    Foo(char a_, char b_) : a(a_), b(b_) { }

    char a;
    char b;
};

// Output stream operator
std::ostream& operator << (std::ostream& os, const Foo& f)
{
    os << f.a << f.b;
    return os;
}

// Input stream operator
std::istream& operator >> (std::istream& is, Foo& f)
{
    if (is.good()) 
    {
        std::istreambuf_iterator<char> it(is);
        std::istreambuf_iterator<char> end;

        if (it != …
Run Code Online (Sandbox Code Playgroud)

c++ iostream istream-iterator istream

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

in(std :: cin):这是什么意思?

在Boost的第一个例子中in(std::cin)使用.我认为in()得到一个istream并创建一些迭代器.但是,我找不到任何能够详细解释它的C++文档.你能帮我找一个吗?

这是Boost网页上示例的复制和粘贴:

#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)

c++ stl istream-iterator

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

使用模板<class InputIterator> string时出现奇怪错误(InputIterator begin,InputIterator end);

鉴于这样的代码段:

#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
using namespace std;
int main(){
    ifstream file("1.txt");
    string str((istream_iterator<char>(file)),istream_iterator<char>());
    file.close();
    cout<<str<<endl;
}
Run Code Online (Sandbox Code Playgroud)

该代码使用istream_iterator从文件构造一个字符串.

请注意,字符串构造函数的第一个参数用一对括号括起来.如果省略括号,则会出错.在VC++ 2008中,会出现链接错误.在G ++中,代码输出错误.

我对括号感到很奇怪.有什么区别,为什么?

c++ iterator stl stdstring istream-iterator

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

istream_iterators之间的距离

我想,以计算读元素的含量std::cin,通过使用std::distance预先为载体的构造函数的参数,就像这样:

// Gives correct amount, but now can't use to put into vector
int size = std::distance(std::istream_iterator<std::string>(std::cin),
        std::istream_iterator<std::string>());

std::vector v(size);

// Already read from stream
std::copy(...);
Run Code Online (Sandbox Code Playgroud)

显然,我可以一步完成std::copy,但这需要事先设置一个尺寸.我的问题不是关于向量,而是关于在std::istream_iterator不影响流的情况下使用任意输入的大小.有任何想法吗?

c++ distance istream-iterator

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

如何使 std::istream_iterator 只读到行尾?

有以下一段代码:

std::vector<int64> values;
std::copy(
  std::istream_iterator<int64>(std::cin),
  std::istream_iterator<int64>(),
  std::back_inserter(values)
);
Run Code Online (Sandbox Code Playgroud)

我想让它只读取输入流直到行尾。我怎样才能做到这一点std::istream_iterator

c++ istream-iterator istream

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

为什么我不能用一个未命名的临时构造一个std :: istream_iterator?

g ++允许从ifstream实例构造istream_iterator:

std::ifstream ifstr("test.txt");
std::istream_iterator<std::string> iter1(ifstr);
Run Code Online (Sandbox Code Playgroud)

...但它不允许使用未命名的临时构造:

std::istream_iterator<std::string> iter2(std::ifstream("test.txt"));
Run Code Online (Sandbox Code Playgroud)

这给出了:

错误:没有用于调用'std :: istream_iterator,ptrdiff_t> :: istream_iterator(std :: ifstream)'的匹配函数

有谁知道为什么这不起作用?- 谢谢!

c++ constructor istream-iterator

2
推荐指数
1
解决办法
449
查看次数

istream_iterator问题,在循环中使用

为什么这个循环不会终止?程序打印出istream_iterator中的所有元素后冻结.

 /*30*/ int main( int arc, char **arv ) {
 /*31*/     vector<float> numbers( 0 );
 /*32*/     cout << "Please, input even number of floats: ";
 /*33*/     istream_iterator<float> iit (cin);
 /*34*/     istream_iterator<float> eos;
 /*35*/     while( iit != eos ) {
 /*36*/         cout << (*iit) << endl; 
 /*37*/         iit++;
 /*38*/     }   
 /*39*/     if( numbers.size( ) & 1 == 1 ) {
 /*40*/         cerr << "Sorry: you must input"
 /*41*/              << " an even number of inputs" << endl;
 /*42*/     }                                               
 /*43*/     return …
Run Code Online (Sandbox Code Playgroud)

c++ stl istream-iterator

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

C++中istream_iterator的奇怪结果

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <list>
using namespace std;

int main()
{
    istream_iterator<int> in_iter(cin);
    istream_iterator<int> eof;
    vector<int> vin;
    /*while (in_iter!=eof)
    {
        vin.push_back(*in_iter++);
    }*/
    istream_iterator<int> in_iter2(cin), eof2;
    vector<int> vin2(in_iter2,eof2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我输入1 2 3 c(最后一个元素'c'使cin状态为EOF)到程序时,最后,vin2将包含元素:2 3;但是,当我注释变量的声明时in_iter,相同的输入将vin2包含元素:1 2 3; How变量声明in_iter是否对此程序有效?谢谢!

c++ istream-iterator

2
推荐指数
1
解决办法
206
查看次数

为什么 std::istream_iterator&lt; std::string_view &gt; 无法编译?

为什么 GCC 和 Clang 无法编译下面的代码片段(链接)?我想返回 s 的向量std::string_view,但显然无法string_view从 中提取 s stringstream

#include <iostream>
#include <sstream>
#include <string>
#include <string_view>
#include <vector>
#include <iterator>
#include <algorithm>
#include <ranges>


[[ nodiscard ]] std::vector< std::string_view >
tokenize( const std::string_view inputStr, const size_t expectedTokenCount )
{
    std::vector< std::string_view > foundTokens { };

    if ( inputStr.empty( ) ) [[ unlikely ]]
    {
        return foundTokens;
    }

    std::stringstream ss;
    ss << inputStr;

    foundTokens.reserve( expectedTokenCount );

    std::copy( std::istream_iterator< std::string_view >{ ss }, …
Run Code Online (Sandbox Code Playgroud)

c++ istream-iterator libstdc++ string-view

2
推荐指数
1
解决办法
219
查看次数