以下代码的行为与我的预期不符.请帮我理解它是如何工作的.
#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
请考虑以下示例代码:
#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) 为了将我从输入文件中读取的内容复制到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文件,我在这上面浪费了太多时间,我希望我能从中学到新东西.你能否告诉我上面代码的第一个版本有什么问题?
我希望能够解决这样的问题:Getting std::ifstream to handle LF, CR, and CRLF? 其中 anistream需要通过复杂的分隔符进行标记;这样标记化的唯一方法istream是:
istream一次读取一个字符正则表达式非常擅长用复杂的分隔符标记字符串:
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,或者如果我想要它,我必须自己编写它吗?
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) 我有一个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 个字符,但它只是 …
我试图编写一个代码来从名为"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++接口,允许用户迭代从文件解码的对象.这种解码过程有点慢.
我正在考虑这个迭代器接口,但我想避免任何不必要的副本,所以我在考虑(用户方):
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,读取数据的方法也会返回副本(它们提取字符).
我正试图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 …
我无法理解下面的代码。
(来自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 …