从C ++流中读取特定数量的字符到std :: string

时间:2013-04-08 15:48:49

标签: c++ iostream stdstring

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

我正在寻找一种从C ++流中读取固定数量字符到std::string的相对有效的方法。我可以使用char方法轻松读入一个临时的read()数组并将其转换为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()来解决问题,但我正在使用的代码大量使用了流,我认为以一致的方式保持我的代码添加是一种很好的做法。

1 个答案:

答案 0 :(得分:9)

你走在正确的轨道上。 :)

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

修改

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

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