标签: istream

为什么复杂的<double>上的operator >>如果达到EOF则没有设置eofbit?

我试图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 ++一起使用:

使用g ++在coliru上运行

使用clang ++和libc ++在coliru上运行 …

c++ std istream complex-numbers eof

9
推荐指数
1
解决办法
161
查看次数

FILE*和istream:连接两个?

假设我"popen"一个可执行文件,我得到一个FILE*回报.此外,假设我想将此文件"连接"到一个istream对象以便于处理,有没有办法做到这一点?

c++ linux popen istream

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

跳过std :: istream中的行

我正在使用std :: getline()从std :: istream派生类中读取行,如何向前移动几行?

我必须阅读并丢弃它们吗?

c++ istream

8
推荐指数
4
解决办法
2万
查看次数

从流输入到枚举类型

如何从流输入到枚举类型?

我可以这样做

unsigned int sex = 0;
stream >> sex;
student.m_bio.sex = static_cast<Sex>(sex);
Run Code Online (Sandbox Code Playgroud)

除此以外?

c++ enums istream

8
推荐指数
1
解决办法
5300
查看次数

libc ++和libstdc ++之间的istream eof差异

当与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)

c++ istream libstdc++ libc++

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

C++ While(cin >> x)如何工作?

我的问题是怎么做

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的实现兼容的东西.

c++ operators cin istream

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

libc ++和libstdc ++之间istream的运算符>>(double和val)之间的差异

随着我最近升级到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 …

c++ stringstream istream libstdc++ libc++

8
推荐指数
1
解决办法
455
查看次数

将std :: istream &&作为参数是否合理?

我遇到过这样做的代码:

SomeObject parse (std::istream && input) {....
Run Code Online (Sandbox Code Playgroud)

所述input参数是一个rvalue参考,这通常意味着该函数取意参数的所有权.这不是这里发生的事情.

parse函数将完全消耗输入流,并且它需要rvalue引用,因为然后调用代码将放弃对该属性的所有权,istream因此这是输入流将不可用的信号.

我认为这是可以的,因为由于parse函数实际上没有移动对象,所以没有切掉子类型的危险.从parse观点来看,这基本上表现为普通参考,只有对调用函数有一种可编译的注释,你必须放弃对流的所有权.

这段代码真的安全吗?或者是否有一些被忽视的微妙之处使这变得危险?

c++ iostream istream rvalue-reference

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

当输入行结尾混合时,std :: getline替代

我试图从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.

当然必须有更好的方法吗?!?

c++ stdin stdio line-endings istream

7
推荐指数
1
解决办法
3176
查看次数

方便地将std :: vector <unsigned char>复制到输入流(std :: istream)对象

我正在尝试使用第三方库中的函数,并期望输入流对象,其中传输二进制文件数据.

签名看起来像这样:

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

c++ copy vector istream unsigned-char

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