如何重用stringstream

时间:2012-08-24 15:21:56

标签: c++ file parsing text stringstream

这些主题不回答我:

resetting a stringstream

How do you clear a stringstream variable?

        std::ifstream file( szFIleName_p );
        if( !file ) return false;

        // create a string stream for parsing

        std::stringstream szBuffer;

        std::string szLine;     // current line
        std::string szKeyWord;  // first word on the line identifying what data it contains

while( !file.eof()){

            // read line by line

            std::getline(file, szLine);

            // ignore empty lines

            if(szLine == "") continue;

            szBuffer.str("");
            szBuffer.str(szLine);
            szBuffer>>szKeyWord;

szKeyword将始终包含第一个单词,szBuffer未被重置,无法在任何地方找到有关如何使用stringstream的明确示例。

回答后的新代码:

...
            szBuffer.str(szLine);
            szBuffer.clear();
            szBuffer>>szKeyWord;
...

好的,那是我的最终版本:

        std::string szLine;     // current line
        std::string szKeyWord;  // first word on the line identifying what data it contains

        // read line by line

        while( std::getline(file, szLine) ){

            // ignore empty lines

            if(szLine == "") continue;

            // create a string stream for parsing

            std::istringstream szBuffer(szLine);
            szBuffer>>szKeyWord;

6 个答案:

答案 0 :(得分:27)

调用clear()后,您没有str("")该流。再看一下this answer,它还解释了为什么要使用str(std::string())进行重置。在您的情况下,您还可以仅使用str(szLine)重置内容。

如果你不调用clear(),流的标志(如eof)将不会被重置,从而导致令人惊讶的行为;)

答案 1 :(得分:8)

这取决于你正在做什么。这通常更容易 创建新的istringstreamostringstream。要“重置”流, 你必须清除它的缓冲区,清除任何错误标志,重置任何 格式化标志,加上精度和填充,重新imbue它与 原始区域设置,不要忘记任何扩展格式信息 使用从xalloc返回的值生成。总之,不可能 得到正确的。

虽然我在这,但你的循环是错误的,并且可能会导致 最后一行被处理两次。 file.eof()只有一个有用的含义 输入失败后(即便如此,它不是100%可靠)。 你想要的是:

std::string line;
while ( std::getline( file, line ) ) {
    if ( !line.empty() ) {
        std::istringstream buffer( line );
        //  ...
    }
}

(实际上,您可能希望修剪该行的尾随空格 在测试之前为空。)

答案 2 :(得分:1)

在大多数情况下,创建新的istringstreamostringstream会更容易,而不是重置相同的内容。

但是,如果你想反感他们:

  • 使用clear ()重新发送流的标记(以避免意外行为)。

  • 虽然您可以使用stringstream更正str ("")的内容,但为了提高效率,我们可能更喜欢str(std::string())

答案 3 :(得分:0)

ss是stringstream。使用

  • 第一步:ss.clear();
  • 第二步:ss.str(“”);

重用stringstream - 完全清除字符串流。

答案 4 :(得分:0)

如果你有一个班级成员的流, 使用unique_ptr<stringstream>, 然后只需reset(new stringstream(...))重复使用它。

答案 5 :(得分:0)

想象一个配置文件。

par1=11
par2=22

代码:

std::string line, strpar1, strpar2;
int par1, par2;
std::ifstream configfile("config.cfg");

std::getline(configfile, line);    // first line to variable "line"
std::istringstream sline(line);
while (std::getline(sline, strpar1, '='));
par1 = std::stoi(strpar1);  // par1 get 11

bool b = sline.eof(); // true

std::getline(configfile, line);    // second line to variable "line"
sline.clear();    //
sline.str(line);    // reuse "sline"

b = sline.good();  // true  // goodbit is zero, indicating that none of the other bits is set.
b = sine.fail();  // false
b = sline.bad();  // false
b = sline.eof(); // false

while (std::getline(sline, strpar2, '='));
par2 = std::stoi(strpar2);  // par2 get 22

goodbit is zero, indicating that none of the other bits is set

相关问题