我已经四处看了看,但仍然没有找到如何做到这一点,所以,请耐心等待。
假设我必须读取包含不同类型数据的txt文件,其中第一个浮点数是一个id,然后有一些(不总是相同数量)其他浮点数表示其他内容...次例如,成对出现。
所以文件看起来像:
1 0.2 0.3
2.01 3.4 5.6 5.7
3 2.0 4.7
...
经过大量研究后,我最终得到了这样的函数:
vector<Thing> loadThings(char* filename){
vector<Thing> things;
ifstream file(filename);
if (file.is_open()){
while (true){
float h;
file >> h; // i need to load the first item in the row for every thing
while ( file.peek() != '\n'){
Thing p;
p.id = h;
float f1, f2;
file >> f1 >> f2;
p.ti = f1;
p.tf = f2;
things.push_back(p);
if (file.eof()) break;
}
if (file.eof()) break;
}
file.close();
}
return things;
}
但(file.peek() != '\n')
条件的while循环本身永远不会完成,我的意思是...... peek永远不等于'\n'
有人知道为什么吗?或者使用>>
运算符读取文件的其他方式?!
非常感谢你!
答案 0 :(得分:5)
只是建议另一种方式,为什么不使用
// assuming your file is open
string line;
while(!file.eof())
{
getline(file,line);
// then do what you need to do
}
答案 1 :(得分:2)
要跳过任何字符,您应该在到达while(file.peek() != '\n')
istream& eatwhites(istream& stream)
{
const string ignore=" \t\r"; //list of character to skip
while(ignore.find(stream.peek())){
stream.ignore();
}
return stream;
}
更好的解决方案是将整行读入字符串而不是使用istringstream
来解析它。
float f;
string line;
std::getline(file, line);
istringstream fin(line)
while(fin>>f){ //loop till end of line
}
答案 2 :(得分:0)
在您和其他朋友的帮助下,我最终更改代码以使用getline()代替。这是结果,希望它可以帮助某人。
typedef struct Thing{
float id;
float ti;
float tf;
};
vector<Thing> loadThings(char* filename){
vector<Thing> things;
ifstream file(filename);
if (file.is_open()){
string line;
while(getline(file, line))
{
istringstream iss(line);
float h;
iss >> h;
float f1, f2;
while (iss >> f1 >> f2)
{
Thing p;
p.id = h;
p.ti = f1;
p.tf = f2;
things.push_back(p);
}
}
file.close();
}
return things;
}
感谢您的时间!