当我尝试编译代码时
istream in;
if (argc==1)
in=cin;
else
{
ifstream ifn(argv[1]);
in=ifn;
}
Run Code Online (Sandbox Code Playgroud)
gcc失败了,抱怨operator=是私密的.有没有办法istream根据条件设置不同的值?
十年前,我曾经是一名C++专家,但在过去的十年里,我一直在编写Java.我刚刚开始使用一个小型第三方XML解析器的C++项目.XML解析器接受STL istream.我的XML数据来自Windows COM IStream.我以为我会做正确的事情并创建一个适配器来获取IStream数据并通过istream将它呈现给XML解析器.
我按照http://www.mr-edd.co.uk/blog/beginners_guide_streambuf上的优秀教程创建了一个COMStreambuf,它从底层的COM IStream获取数据,并将其用作自定义COMIstream的缓冲区.一切看起来都不错,但我从解析器中得到一个读错误.
事实证明,解析器通过在istream上使用seekg()来读取整个文件到内存中以查找其大小,然后使用seekg()返回到开头一次读取它.不出所料,前面提到的教程决定"保存[实施寻求的指示]另一篇文章",这显然从未写过.
有人能告诉我我需要做什么来实现我的自定义istream/streambuf的seekg()吗?我会冒险自己做(我的第一个倾向是覆盖istream中的东西),但由于我在STL的深层次和我的Java心态,我担心我会做一些不完整的事情并且有一个脆弱的解决方案.(例如,在没有阅读教程的情况下,我从来没有想过通过编写新的streambuf来制作自定义istream,或者我需要使用默认语言环境调用imbue()等)
谢谢你的帮助.我对这个网站印象非常深刻 - 无论是参与者的知识还是他们友好,诚实的承认谁拥有最佳答案.:)
我有一堆输入文件,如下所示:
(8,7,15)
(0,0,1) (0,3,2) (0,6,3)
(1,0,4) (1,1,5)
Run Code Online (Sandbox Code Playgroud)
我需要编写一个函数,一次解析这些输入一个数字,所以我需要能够用数字分隔输入,例如:8,然后是7,然后是15,然后是0,再是0,依此类推.
到目前为止我唯一想到的方法是使用istream.get()返回下一个字符的ASCII码,我可以通过将其转换为char来转换回其字符格式.然后我会检查字符是否是数字(因此括号被忽略)但这样,任何双(或三)数字数字一次只能读取一位数.
实现这一目标的最佳方法是什么?
顺便说一句,我必须使用istream.这是规范的一部分,我不允许改变
谢谢
以下代码适用于gcc 4.4.
但是gcc 4.7会让断言失败.
#include <assert.h>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
string input("abcdefg");
stringstream iss(input);
ostringstream oss;
oss << iss.rdbuf();
assert (!iss.eof());
(void) iss.peek();
assert (iss.eof());
// the following assertion will fail with gcc 4.7
assert( streamoff(iss.tellg()) ==
streamoff(input.length()) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在gcc 4.7中,如果istream已达到EOF,则tellg()将返回-1.不会调用pubseekoff()和seekoff()在gcc 4.4中它不是问题.
应该是哪种行为,gcc 4.4还是gcc 4.7?为什么?
我开发了一个简单的包装器,它使用Boost属性树封装了一个JSONObject.问题是此代码中的分段错误:
void JSONObject::parse(const std::string &text)
{
std::istringstream ss(text);
boost::property_tree::read_json(ss, *pt);
}
Run Code Online (Sandbox Code Playgroud)
一点上下文,我使用JSON进行消息序列化.如果程序只使用一个线程,它可以正常工作.但是如果程序使用两个线程在上面的代码的最后一行中给出了一个分段错误.
每个线程都有自己的JSONObject对象,并且线程之间不共享任何变量.我的想法是,流内部可能不是线程安全的.
谁能帮我?
接口/ C++的下面的函数部分,它返回一个istream*.如果我只是尝试打印它,它显示十六进制或内存位置,因为它的*类型.
istream *stream = res->getBlob(1);
Run Code Online (Sandbox Code Playgroud)
我试着阅读并打印出来:
string s;
while (getline(*stream, s))
cout << s << endl;
Run Code Online (Sandbox Code Playgroud)
但是这会因访问冲突而崩溃.我可以打印或转换为字符串的任何其他方式?
getline之前的stream值:
所以它似乎对我有效.如果失败,我认为它将为null或0
我有以下代码:
#include <iostream>
#include <boost\lexical_cast.hpp>
struct vec2_t
{
float x;
float y;
};
std::istream& operator>>(std::istream& istream, vec2_t& v)
{
istream >> v.x >> v.y;
return istream;
}
int main()
{
auto v = boost::lexical_cast<vec2_t>("1231.2 152.9");
std::cout << v.x << " " << v.y;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我从Boost收到以下编译错误:
错误1错误C2338:目标类型既不是std :: istream
able nor std::wistream能够的
这看起来很简单,过去一小时我一直在桌子上打我的头.任何帮助,将不胜感激!
编辑:我正在使用Visual Studio 2013.
许多站点描述了istream :: putback()函数,它允许您将一个字符"放回"到输入流中,以便您可以在后续的读取操作中再次读取它.
但是,阻止我在同一个流上按顺序多次调用putback()会有什么阻碍?当然,你应该在每次操作后检查错误,以确定它是否成功; 然而,我想知道:有没有保证特定类型的流支持一次放回多个字符?
我只是在这里猜测,但我可以想象istringstream能够放回与流中字符串长度一样多的字符; 但我不太确定ifstream的情况是一样的.
这是真的吗?如何才能知道我有多少个字符可以补篮()为istream对象?
我正在尝试创建一个istream直接从原始内存缓冲区读取的内容.
我在这里的另一篇文章中找到了一个很好的方法:
class membuf : public basic_streambuf<char>
{
public:
membuf(char* p, size_t n) {
setg(p, p, p + n);
}
};
Run Code Online (Sandbox Code Playgroud)
然后我创建我istream使用这个membuf:
membuf mb(dataPointer, dataLength);
istream reader(&mb);
Run Code Online (Sandbox Code Playgroud)
然后我阅读使用getline()和>>运算符,一切都很棒.但是,我似乎无法seekg()回退到缓冲区的开头,并且istream::tellg()总是返回-1.
我是否需要编写更多代码才能使这些代码发挥作用,或者这注定要失败?
显然,C++20 有一个新的std::istream相关构造:std::istream_view。其上的 cppreference 页面现在是一个存根\xe2\x80\xa0。那么,什么是“视图istream”以及我可以用它做什么?
\xe2\x80\xa0 - 好吧,从技术上讲,它重定向到一个关于该std::basic_istream_view存根的页面。