Бесконечный цикл с помощью метода .eof ()

Я пытаюсь выполнить упражнение C ++ по проекту альбома. По сути, мне нужно иметь 4 класса, а именно: Duration, Track (объект длительности + название трека), Album (имя исполнителя, название альбома и коллекция моего объекта Track) и AlbumCollection (только коллекция объектов Album) является переменной

Я проверил весь класс, присвоив значение или данное значение с клавиатуры, и все они работают. Тем не менее, когда я пытаюсь попросить их прочитать в текстовом файле. Это просто продолжает цикл в альбоме collection.app и никогда не останавливается. Я знаю, что моя проблема в операторе >> и сделал ли я что-то не так с битом с ошибкой. Тем не менее, я действительно не знаю, что мне делать, чтобы это исправить.

Это мой >> оператор в объекте Duration

inline std::istream& operator >> (std::istream& is, Duration& f)
{
char c;
int h,m,s;

if (is >> h >> c >> m >> c >> s){
if (c==':'){
f = Duration (h,m,s);
}
else{
is.clear(std::ios_base::failbit);
}
} else{
is.clear(std::ios_base::failbit);
}
return is;

}

Это мой >> оператор в объекте Track

istream& operator>>(istream& is, Track& t){
Duration duration;
char trackTitle[256];
char c1;

if (is>>duration>>c1){
is.getline(trackTitle,256);
t = Track(duration,trackTitle);

}
else{
is.clear(ios_base::failbit);
}
return is;

}

Это мой оператор >> в классе Album

istream& operator>>(istream& is, Album& album){
char artistName[256];
char albumTitle [256];
vector<Track> trackCollection;
Track track;is.getline(artistName, 256, ':');
is.getline(albumTitle, 256);

while ((is>>track) && (!is.fail())){

trackCollection.push_back(track);
}

album = Album(artistName,albumTitle,trackCollection);

if (is.eof()){
is.clear(ios_base::failbit);
is.ignore(256,'\n');
}
else{
is.clear();
}

return is;

}

и это мой оператор >> в классе AlbumCollection

std::istream& operator>>(std::istream& is,AlbumCollection& albumCollection){
Album album;

vector<Album>albums;
while (is>>album) {

albumCollection.addAlbum(album);
}

return is;

}

and the format of the input file .txt is:
The Jimi Hendrix Experience: Are you Experienced?
0:03:22 - Foxy Lady
0:03:32 - Highway Chile
Pink Floyd: Dark Side of the Moon
0:01:30 - Speak to Me
0:02:43 - Breathe

Не могли бы вы помочь мне в этом? Я старался изо всех сил, чтобы решить, но все же я не могу сделать это: (((((

Большое спасибо

-3

Решение

Проблема в operator>> из Album, Этот оператор пытается прочитать как можно больше треков, пока Track operator>> сигнализирует об ошибке чтения. После этого Album operator>> сбрасывает статус ошибки потока.
Постоянно сбрасывая статус ошибки потока, даже если имя исполнителя или название альбома не может быть прочитано, оператор не может сигнализировать, что он исчерпал все альбомы.

Поскольку, как правило, невозможно определить, где заканчивается «коллекция X» при сохранении в файле, принято хранить ожидаемое количество элементов перед фактическими элементами.
Для этого вам необходимо изменить формат файла (например):

2
The Jimi Hendrix Experience: Are you Experienced?
2
0:03:22 - Foxy Lady
0:03:32 - Highway Chile
Pink Floyd: Dark Side of the Moon
2
0:01:30 - Speak to Me
0:02:43 - Breathe

Если изменение формата файла не вариант, вы также можете изменить operator>> за Album выручить рано, если нет исполнителя и / или альбома для чтения.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]