std::getline 没有按照我的预期去做 请参阅下面的代码
std::getline is not doing what I expect it to do See my code below
我正在使用RHEL5.4、QT4.8
只有文件的第一行在 getline 中得到处理。
我在 stringstream ss 上的 qDebug 打印文件中的所有行。
我在记录结构上的 qDebug 重复文件第一行中的数据以获取总数
文件中的行数。
我在结果向量上的 qDebug 再次重复文件第一行中的数据以获得总数
文件中的行数。
首先我在头文件中声明了一个记录结构
struct data_rec
{
std::string name;
std::string value;
};
std::ifstream myfile("foo.bar");
if(!myfile.is_open()){
qDebug() << "Could not open file";
}else {
qDebug() << "File opened";
std::string line;
std::stringstream ss;
std::stringstream tss;
while(std::getline(myfile,line))
{
data_rec records;
tss.str("");
ss<<line<<std::endl;
tss<<line<<std::endl; //; temp stringstream
std::getline(tss, records.name, ',');
std::getline(tss, records.value, ',');
qDebug()<<"!!!" << records.name.c_str();
qDebug()<<"!!!" << records.value.c_str();
result.push_back(records);
tss.str(std::string());
}
for(int x = 0; x < 46; x++)
{
QString tstr1 = QString::fromStdString(result[i].name);
QString tstr2 = QString::fromStdString(result[i].value);
qDebug() << tstr1 << " -> " << tstr2;
}
qDebug() << QString::fromStdString(ss.str());
qDebug() << "\n////////////////////////////////////////\n";
myfile.close();
}
您在每次循环迭代中重复使用 tss
,但您并未在每次迭代中清除其错误状态,仅清除其字符串内容。当第一次迭代完成时,如果该行未由 ','
字符终止,则流可能已达到 EOF 并且现在处于错误状态。使用空字符串调用 tss.str()
不会清除错误状态,您需要为此调用 tss.clear()
,否则下一次调用 getline(tss)
将失败。
while (std::getline(myfile, line))
{
data_rec records;
// tss.str(""); // <-- redundant here!
ss << line << std::endl;
tss << line << std::endl;
std::getline(tss, records.name, ',');
std::getline(tss, records.value, ',');
qDebug() << "!!!" << records.name.c_str();
qDebug() << "!!!" << records.value.c_str();
result.push_back(records);
tss.str(std::string());
tss.clear(); // <-- add this!
}
否则,根本不要重复使用 stringstream
,每次迭代都创建一个新的:
while (std::getline(myfile, line))
{
data_rec records;
std::istringstream tss(line); // <-- here!
ss << line << std::endl;
std::getline(tss, records.name, ',');
std::getline(tss, records.value, ',');
qDebug() << "!!!" << records.name.c_str();
qDebug() << "!!!" << records.value.c_str();
result.push_back(records);
}
就是说,当 while
循环完成后,您的后续 for
循环假定 result
包含 46 个元素,但 while
循环中没有任何元素这保证了。 for
循环应该查看 result.size()
而不是:
for(size_t x = 0; x < result.size(); x++)
我正在使用RHEL5.4、QT4.8 只有文件的第一行在 getline 中得到处理。 我在 stringstream ss 上的 qDebug 打印文件中的所有行。 我在记录结构上的 qDebug 重复文件第一行中的数据以获取总数 文件中的行数。 我在结果向量上的 qDebug 再次重复文件第一行中的数据以获得总数 文件中的行数。
首先我在头文件中声明了一个记录结构
struct data_rec
{
std::string name;
std::string value;
};
std::ifstream myfile("foo.bar");
if(!myfile.is_open()){
qDebug() << "Could not open file";
}else {
qDebug() << "File opened";
std::string line;
std::stringstream ss;
std::stringstream tss;
while(std::getline(myfile,line))
{
data_rec records;
tss.str("");
ss<<line<<std::endl;
tss<<line<<std::endl; //; temp stringstream
std::getline(tss, records.name, ',');
std::getline(tss, records.value, ',');
qDebug()<<"!!!" << records.name.c_str();
qDebug()<<"!!!" << records.value.c_str();
result.push_back(records);
tss.str(std::string());
}
for(int x = 0; x < 46; x++)
{
QString tstr1 = QString::fromStdString(result[i].name);
QString tstr2 = QString::fromStdString(result[i].value);
qDebug() << tstr1 << " -> " << tstr2;
}
qDebug() << QString::fromStdString(ss.str());
qDebug() << "\n////////////////////////////////////////\n";
myfile.close();
}
您在每次循环迭代中重复使用 tss
,但您并未在每次迭代中清除其错误状态,仅清除其字符串内容。当第一次迭代完成时,如果该行未由 ','
字符终止,则流可能已达到 EOF 并且现在处于错误状态。使用空字符串调用 tss.str()
不会清除错误状态,您需要为此调用 tss.clear()
,否则下一次调用 getline(tss)
将失败。
while (std::getline(myfile, line))
{
data_rec records;
// tss.str(""); // <-- redundant here!
ss << line << std::endl;
tss << line << std::endl;
std::getline(tss, records.name, ',');
std::getline(tss, records.value, ',');
qDebug() << "!!!" << records.name.c_str();
qDebug() << "!!!" << records.value.c_str();
result.push_back(records);
tss.str(std::string());
tss.clear(); // <-- add this!
}
否则,根本不要重复使用 stringstream
,每次迭代都创建一个新的:
while (std::getline(myfile, line))
{
data_rec records;
std::istringstream tss(line); // <-- here!
ss << line << std::endl;
std::getline(tss, records.name, ',');
std::getline(tss, records.value, ',');
qDebug() << "!!!" << records.name.c_str();
qDebug() << "!!!" << records.value.c_str();
result.push_back(records);
}
就是说,当 while
循环完成后,您的后续 for
循环假定 result
包含 46 个元素,但 while
循环中没有任何元素这保证了。 for
循环应该查看 result.size()
而不是:
for(size_t x = 0; x < result.size(); x++)