【问题标题】:Reading a specific number of characters from C++ stream into std::string从 C++ 流中读取特定数量的字符到 std::string
【发布时间】:2013-04-08 15:48:48
【问题描述】:

我对大多数 C++ 都非常熟悉,但我一直避免使用的一个领域是 IO 流,主要是因为我一直在不合适的嵌入式系统上使用它。然而,最近我不得不熟悉它们,我正在努力找出一些我认为应该简单的东西。

我正在寻找一种相对有效的方法来将 C++ 流中的固定数量的字符读入std::string。我可以使用read() 方法轻松读取临时char 数组并将其转换为std::string,但这相当难看并且涉及浪费副本。我还可以将整个流读入一个字符串,如下所示:

std::string getFile(std::fstream &inFile)
{
    std::stringstream buffer;
    buffer << inFile.rdbuf();
    return buffer.str();
}

...但是无限制地读取内存通常不是一个好主意,所以我真的很想一次访问一个文件块,比如 4K 左右。我也可以一次读取字符,但这感觉比读取临时 char 数组更丑陋且效率更低。

那么,有没有一种简单的方法可以直接从包含流中接下来的 N 个字符的流中获取std::string?很可能根本没有办法做到这一点,但我觉得这样的东西会丢失很奇怪,所以我觉得我一定丢失了一些明显的东西。

顺便说一句,我对 C 文件 IO API 非常熟悉,我并不是在寻找涉及它们的解决方案。我可以用read()write() 解决问题,但是我正在使用的代码大量使用流,我认为保持我的代码添加的风格一致是一个好习惯。

【问题讨论】:

标签: c++ iostream stdstring


【解决方案1】:

你在正确的轨道上。 :)

mystring.resize( 20 );
stream.read( &mystring[0], 20 );

编辑:

在 C++11 中。这是定义明确且安全的。 不同 data()c_str(), std::string::operator[] 提供对基础数据的可变引用。

在 C++03 中,它在实际意义上是安全的,但 std::string 的定义太弱,无法保证这种安全性。 C++03 allowed 字符串数据是不连续的,但我不相信任何可用的实现都利用了这一点。

【讨论】:

  • @Nawaz 当谈到我的问题时,我感到相当震惊。 :)
  • 我知道当这些棘手的想法出现并让你的生活变得轻松时的感觉
  • 是的,看起来可以,但是安全吗?例如,据我所知,写入data()c_str() 的结果是未定义的行为。我不确定这是否会弄乱,例如,GNU STL 的底层字符缓冲区的写时复制语义。任何人都可以提供证据证明这实际上是大多数平台上的安全操作吗? This page 好像说不...
  • @Cartroo,请仔细阅读页面,这些注释仅适用于您引用字符串末尾之后的字符时。在这种情况下不会发生这种情况。 C++11 中不允许写入时复制字符串,请参阅stackoverflow.com/questions/12199710/…
  • 是的,谢谢马克,我自己也发现了这一点——很抱歉没有仔细阅读。在对 GNU STL 进行了一些探索之后,似乎调用 c_str()data() 不会调整底层指针,并且更改会影响其他副本,正如您对 CoW 系统所期望的那样。但是,调用非const operator[] 似乎确实足以触发复制操作,因此写入应该非常安全。感谢您的帮助。
猜你喜欢
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2014-01-26
  • 2019-09-01
相关资源
最近更新 更多