Читайте файл до конца строки с помощью & gt; & gt; операторы

Я много осматривался и до сих пор не нашел, как это сделать, поэтому, пожалуйста, потерпите меня.

Допустим, мне нужно прочитать txt-файл, который содержит данные различного типа, где первый float — это id, а затем есть несколько (не всегда одинаковое количество) других float, представляющих другие вещи … например, раз , в парах.

Таким образом, файл будет выглядеть примерно так:

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') условие никогда не заканчивается само по себе, я имею в виду … взгляд никогда не равняется '\n'

У кого-нибудь есть идея, почему? Или, возможно, какой-то другой способ прочитать файл с помощью >> операторы ?!
Большое спасибо!

1

Решение

просто предлагая другой способ, почему бы не использовать

// assuming your file is open
string line;

while(!file.eof())
{
getline(file,line);

// then do what you need to do

}
5

Другие решения

Чтобы пропустить любой символ, вы должны попытаться вызвать такую ​​функцию, прежде чем достичь 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

С небольшой помощью от вас и других друзей я в итоге изменил код, чтобы использовать вместо него 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;
}

Спасибо за ваше время!

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector