Ice*_*000 17 c++ parsing text file stringstream
这些线程不回答我:
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;
Run Code Online (Sandbox Code Playgroud)
szKeyword将始终包含第一个单词,szBuffer未被重置,无法在任何地方找到关于如何使用stringstream的明确示例.
回答后的新代码:
...
szBuffer.str(szLine);
szBuffer.clear();
szBuffer>>szKeyWord;
...
Run Code Online (Sandbox Code Playgroud)
好的,那是我的最终版本:
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;
Run Code Online (Sandbox Code Playgroud)
这取决于你正在做什么.通常更容易创建一个新的istringstream或ostringstream.要"重置"一个流,你必须清除它的缓冲区,清除任何错误标志,重置任何格式化标志,加上精度和填充,imbue用原始语言环境重新设置,并且不要忘记使用从返回的值生成的任何扩展格式信息.xalloc.总之,不可能得到正确的.
虽然我在它,你的循环是错误的,并可能导致最后一行被处理两次. file.eof()输入失败后才有可用的含义(即使这样,它也不是100%可靠).你想要的是:
std::string line;
while ( std::getline( file, line ) ) {
if ( !line.empty() ) {
std::istringstream buffer( line );
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
(实际上,您可能希望在测试之前从行中修剪尾随空格.)
| 归档时间: |
|
| 查看次数: |
29835 次 |
| 最近记录: |