6

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

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

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

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

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

顺便说一句,我对 C 文件 IO API 非常熟悉,我并不是在寻找涉及它们的解决方案。read()我可以用and敲一些东西write(),但是我正在使用的代码大量使用流,我认为让我的代码添加保持一致的风格是一种很好的做法。

4

1 回答 1

9

你在正确的轨道上。:)

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

编辑:

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

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

于 2013-04-08T15:52:12.033 回答