我试图std::complex<double>从文件(或任何std::istream)中尽可能多地阅读.如果操作失败,我检查ios :: eof().如果尚未设置,我认为解析数据时出错,我可以向用户报告输入文件有错误.这种方案适用于双重,但不知何故它在复数上失败.为什么?
以下是一些重现问题的代码:
std::istringstream istr("4 1.2");
std::complex<double> val;
while( istr >> val )
std::cout << " val = " << val << std::endl;
std::cout << "flags: eof=" << istr.eof() << " fail=" << istr.fail() << " bad=" << istr.bad() << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出是
val = (4,0)
val = (1.2,0)
flags: eof=0 fail=1 bad=0
Run Code Online (Sandbox Code Playgroud)
如果我更换std::complex<double>用double,它按预期工作,产生
val = 4
val = 1.2
flags: eof=1 fail=1 bad=0
Run Code Online (Sandbox Code Playgroud)
libstdc ++会出现此问题,但它似乎与libc ++一起使用:
假设我"popen"一个可执行文件,我得到一个FILE*回报.此外,假设我想将此文件"连接"到一个istream对象以便于处理,有没有办法做到这一点?
我正在使用std :: getline()从std :: istream派生类中读取行,如何向前移动几行?
我必须阅读并丢弃它们吗?
如何从流输入到枚举类型?
我可以这样做
unsigned int sex = 0;
stream >> sex;
student.m_bio.sex = static_cast<Sex>(sex);
Run Code Online (Sandbox Code Playgroud)
除此以外?
当与libstdc ++和libc ++链接时,以下(玩具)程序返回不同的东西.这是libc ++中的错误还是我不明白istream eof()是如何工作的?我尝试在linux和mac os x上使用g ++并在mac os x上运行它,使用和不使用-std = c ++ 0x.我的印象是,在尝试读取(通过get()或其他东西)实际上失败之前,eof()不会返回true.这就是libstdc ++的行为方式,而不是libc ++的行为方式.
#include <iostream>
#include <sstream>
int main() {
std::stringstream s;
s << "a";
std::cout << "EOF? " << (s.eof() ? "T" : "F") << std::endl;
std::cout << "get: " << s.get() << std::endl;
std::cout << "EOF? " << (s.eof() ? "T" : "F") << std::endl;
return 0;
}
Thor:~$ g++ test.cpp
Thor:~$ ./a.out
EOF? F
get: 97
EOF? F
Thor:~$ clang++ -std=c++0x -stdlib=libstdc++ test.cpp
Thor:~$ …Run Code Online (Sandbox Code Playgroud) 我的问题是怎么做
while(cin>>x)
{
//code
}
Run Code Online (Sandbox Code Playgroud)
工作.或者更具体地说,那段代码会停止循环?
从这里的文档中,它看起来像>>运算符返回一个&istream.这是否意味着如果读取失败或命中文件末尾它不仅设置eofbit,failbit或badbit而且还返回null?这真的没有意义,所以我怀疑是这样.
有没有对eofbit进行某种隐式检查?
我问,因为我希望用这样的2个类来实现类似的东西,
class B
{
//variables and methods
}
class A
{
//Variables and methods
//Container of B objects. ex. B[] or vector<B> or Map<key,B>
&A >> (B b);
}
int main()
{
A a;
B b;
while( a >> b)
{
//Code
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我不打算继承,istream除非它是使这项工作的魔力来自哪里.这样做的原因是我希望保持类及其依赖关系尽可能小.如果我继承istream我将收到所有公共和受保护的东西,我不是想创建一个istream类似的对象.我只想复制一件真正好看的东西.
编辑:我正在使用Visual Studio 2010(这正在成为一个真正的痛苦),我将需要与它的C++ 03 +一些C++ 11的实现兼容的东西.
随着我最近升级到Mac OS X 10.9,默认的标准C++库从libstdc ++更改为libc ++.从那时起,我观察到下面的代码示例中记录的字符串流运算符>>(double)的意外行为.
总之,当double值后跟一个字母时,libc ++似乎在从stringstreams中提取double值时遇到问题.
我已经检查过标准(2003)但是如果在这种情况下提取应该起作用,我找不到任何具体的信息.
所以,如果这是一个libc ++或libstdc ++中的错误,我将不胜感激.
#include <sstream>
#include <iostream>
using namespace std;
void extract_double(const string & s)
{
stringstream ss;
double d;
ss << s;
ss >> d;
if(!ss.fail())
cout << "'" << ss.str() << "' converted to " << d << endl;
else
cout << "'" << ss.str() << "' failed to convert to double" << endl;
}
int main()
{
extract_double("-4.9");
extract_double("-4.9 X");
extract_double("-4.9_");
extract_double("-4.9d");
extract_double("-4.9X");
}
Run Code Online (Sandbox Code Playgroud)
用c++ --stdlib=libc++ streamtest.cxx …
我遇到过这样做的代码:
SomeObject parse (std::istream && input) {....
Run Code Online (Sandbox Code Playgroud)
所述input参数是一个rvalue参考,这通常意味着该函数取意参数的所有权.这不是这里发生的事情.
该parse函数将完全消耗输入流,并且它需要rvalue引用,因为然后调用代码将放弃对该属性的所有权,istream因此这是输入流将不可用的信号.
我认为这是可以的,因为由于parse函数实际上没有移动对象,所以没有切掉子类型的危险.从parse观点来看,这基本上表现为普通参考,只有对调用函数有一种可编译的注释,你必须放弃对流的所有权.
这段代码真的安全吗?或者是否有一些被忽视的微妙之处使这变得危险?
我试图从a读取行,std::istream但输入可能包含'\r' 和/或 '\n',所以std::getline没有用.
很抱歉大喊,但这似乎需要强调......
有没有标准的方法来做到这一点?目前我正在努力
char c;
while (in >> c && '\n' != c && '\r' != c)
out .push_back (c);
Run Code Online (Sandbox Code Playgroud)
......但这会跳过空白.D'哦!std::noskipws- 需要更多的摆弄,现在它是misehaving.
当然必须有更好的方法吗?!?
我正在尝试使用第三方库中的函数,并期望输入流对象,其中传输二进制文件数据.
签名看起来像这样:
doSomething(const std::string& ...,
const std::string& ...,
std::istream& aData,
const std::string& ...,
const std::map<std::string, std::string>* ...,
long ...,
bool ...);
Run Code Online (Sandbox Code Playgroud)
由于我不能改变/改变这个第三方的lib /功能,我必须适应"我的"代码.在调用的地方,我有一个std :: vector,它包含了预期在istream对象中传递的数据.目前,我将向量复制到流中,通过迭代并使用<<运算符逐字节复制.
我强烈怀疑可能有一种更有效/方便的方式,但迄今为止找不到任何有用的东西.非常感谢任何帮助/您的想法.
最好,JR