22

这些线程不回答我:

重置字符串流

如何清除字符串流变量?

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;
4

6 回答 6

34

clear()调用后你没有流str("")。再看看这个答案,它也解释了为什么你应该使用str(std::string()). 在您的情况下,您还可以使用 only 重置内容str(szLine)

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

于 2012-08-24T15:28:16.603 回答
10

这取决于你用它做什么。通常只创建一个新的istringstreamostringstream. 要“重置”流,您必须清除其缓冲区,清除所有错误标志,重置所有格式标志,加上精度和填充,imbue使用原始语言环境重新设置,并且不要忘记使用从返回的值生成的任何扩展格式信息xalloc. 总而言之,不可能得到正确的。

当我这样做时,您的循环是错误的,并且可能会导致最后一行被处理两次。 file.eof()只有在输入失败后才有意义(即使那样,它也不是 100% 可靠的)。你想要的是:

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

(实际上,您可能希望在测试之前从行中修剪尾随空格以显示为空。)

于 2012-08-24T15:46:59.703 回答
3

ss 是字符串流。采用

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

重用字符串流——完全清除字符串流。

于 2015-12-30T23:09:46.340 回答
1

istringstream在大多数情况下,创建新的或ostringstream重置相同的更容易。

但是,如果您确实想反感他们:

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

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

于 2016-01-03T19:13:15.570 回答
0

如果您在类成员中有流,请使用unique_ptr<stringstream>, 然后只是reset(new stringstream(...))为了重用它。

于 2017-01-23T16:01:40.590 回答
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 为零,表示没有设置其他位

于 2018-06-20T06:30:31.670 回答