【发布时间】:2021-04-07 20:17:34
【问题描述】:
我编写了一个程序,它获取一个文件并将其读入类中的 stringstream 字段,现在我正在尝试与它进行交互。问题是,当从几种方法中顺序读取时,其中一种方法会出错,或者根本不起作用。我想问题是我如何读取文件,我应该如何改进它?
还有我的课:
class MatReader
{
protected:
...
stringstream text;
...
string PhysicsMaterial;
string Diffuse;
string NMap;
string Specular;
public:
/// <summary>
/// Read all lines in .mat document by string
/// </summary>
void ReadAllLines(string file_path);
/// <summary>
/// Getting PhysicsMaterial property
/// </summary>
string getPhysMaterial();
/// <summary>
/// Getting diffuse file path
/// </summary>
string getDiffuseLocation();
};
还有我的实现文件:
#include "MaterialHandler.h"
void MatReader::ReadAllLines(string mat_file)
{
ifstream infile(mat_file);
string str;
if (infile.is_open())
{
ofile = true;
while (!infile.eof())
{
getline(infile, str);
text << str+"\n";
}
}
else
throw exception("[ERROR] file does not exist or corrupted");
}
string MatReader::getPhysMaterial()
{
string line;
vector<string> seglist;
try
{
if (ofile == false)
throw exception("file not open");
while (getline(text, line, '"'))
{
if (!line.find("/>"))
break;
seglist.push_back(line);
}
for (uint16_t i{}; i < seglist.size(); i++)
{
if (seglist[i-1] == " PhysicsMaterial=")
{
PhysicsMaterial = seglist[i];
return seglist[i];
}
}
line.clear();
seglist.clear();
}
catch (const std::exception& ex)
{
cout << "[ERROR]: " << ex.what() << endl;
return "[ERROR]";
}
}
string MatReader::getDiffuseLocation()
{
string line;
vector<string> seglist;
try
{
if (ofile == false)
throw exception("file not open");
while (getline(text, line, '"'))
{
seglist.push_back(line);
}
for (uint16_t i{}; i < seglist.size(); i++)
{
if (seglist[i - 1] == " File=")
{
PhysicsMaterial = seglist[i];
return seglist[i];
}
}
}
catch (const std::exception& ex)
{
cout << "[ERROR]: " << ex.what() << endl;
return "[ERROR]";
}
}
方法“getPhysMaterial()”和“getDiffuseLocation()”单独工作没有任何问题,但如果它们按顺序执行,它们会出错或根本不执行。 谢谢。
【问题讨论】:
-
seglist[i-1]将在第一次迭代时越界访问(当i为 0 时)。 -
正如@1201ProgramAlarm 所指出的,当
i是0时,您没有处理循环的第一次迭代。此外,告诉人们您收到的error的内容会很有帮助。 -
另外,您不会重置内部
std::stringstream指针(它会跟踪您消耗了多少)。这就是为什么当你顺序调用每个方法时它不起作用的原因。 -
@1201ProgramAlarm 是的,非常感谢我会解决这个问题,但这并不能解决问题。如果我只是删除数组输出 - 它仍然不起作用,我问的是字符串流的问题,而不是数组输出。
-
@WBuck 哦,好吧...谢谢,我怎样才能重置字符串流指针? seekp(0) 对我不起作用。
标签: c++ getline stringstream