【问题标题】:std::istream without command line?std::istream 没有命令行?
【发布时间】:2012-01-01 23:31:28
【问题描述】:

基本上我有一个线程使用

从 c++ std::istream 读取
istream& getline ( istream& is, string& str );

当我将 istream 与 cin 绑定时,当我从标准命令行键入输入作为输入时它工作正常。

但我想知道有没有一种方法可以让读取线程 getline 获取字符串而无需 使用实际的命令行?

基本上我想实现这个:

只需调用带有参数str(而不是在命令行中键入str)的函数WriteToIStream,读取线程getilne()就可以得到str

void WriteToIStream(string& str)
{
//...
}

非常感谢

【问题讨论】:

  • 为什么要使用全局cin——你可以创建一个只用于与线程通信的新流。
  • "在不使用实际命令行的情况下获取字符串"那你想从哪里获取字符串呢?
  • @KerrekSB:你能给我一个简单的例子吗,因为我还没有真正写过一个新的流,只使用了那些 c++ iostream fstream 等。在这种情况下也可以 boost::iostream 帮助?
  • std::stringstream 应该可以完成这项工作。
  • @KerrekSB:所以我没有使用 cin,而是使用了共享的 std::stringstream?

标签: c++ iostream getline


【解决方案1】:

cin 只是输入流的一个 实例,绑定到标准输入。对于您的情况,您可以使用istringstream(或更一般的stringstream),它是从字符串中读取的输入流:

std::istringstream istr("foobar");
getline(istr, some_string_variable);

这需要标准头 <sstream>

【讨论】:

  • getline 默认 delim 是 '\n',所以假设每次我需要 getline 需要从共享 istr 中读取某事,我只需要执行 istr
  • @Gob00st 不,你不需要这个,因为当然读取会在流/字符串的末尾停止,不需要换行符。这与任何其他流相同istringstream不是特殊情况。
  • 我已经尝试过了,但是当我在读取线程中使用带有 istringstream 的 getline 时,它​​会立即返回,而不是像 getline 对 cin 那样等待输入。你能解释一下为什么吗?
  • @Gob00st 原因是cin.eof()false,直到用户结束程序的输入(通常通过按键盘上的Ctrl+D)。另一方面,istringstream 由其内容分隔;阅读完所有内容后,就完成了(因此eof() == true)。
  • 谢谢,这很有道理!
猜你喜欢
  • 2020-07-24
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2016-08-29
  • 2020-07-13
  • 2013-11-09
  • 2017-06-28
  • 2014-12-03
相关资源
最近更新 更多