Программа на C++ зависает при использовании cin.getline()
Я делаю программу для отслеживания разных людей, которую я пытаюсь прочитать из файла. Я использую конструктор, который принимает файл ifstream в качестве аргумента, и затем я пытаюсь прочитать данные из файла. Я могу прочитать первую строку, которая представляет собой просто int (уникальный номер для каждого человека), но когда я пытаюсь перейти на следующую строку и получить ее, программа зависает. Кто-нибудь знает почему?
#include <iostream>
#include <fstream>
#include <cstring>
#include <cctype>
#include <cstdlib>
using namespace std;
const int MAXPERS = 100;
const int MAXTXT = 80;
const int DATELEN = 7;
class Person {
private:
int nr;
char* firstName;
char birthDate[DATELEN];
public:
Person() {
char fname[MAXTXT];
cout << "First name: "; cin.getline(fname, MAXTXT);
firstName = new char[strlen(fname) + 1];
strcpy(firstName, fname);
cout << "Birth date (DDMMYY): ";
cin >> birthDate; cin.ignore();
}
Person(int n, ifstream & in) {
nr = n;
char fname[MAXTXT];
cin.getline(fname, MAXTXT);
firstName = new char[strlen(fname) + 1];
strcpy(firstName, fname);
in >> birthDate;
}
void display() {
cout << "\nFirst name: " << firstName;
cout << "\nBorn: " << birthDate;
}
void writeToFile(ofstream & ut) {
ut << firstName << "\n" << birthDate;
}
};
void readFromFile();
Person* persons[MAXPERS + 1];
int lastUsed = 0;
int main() {
readFromFile();
persons[1]->display();
return 0;
}
void readFromFile() {
ifstream infile("ANSATTE.DAT");
if(infile) {
while(!infile.eof() && lastUsed < MAXPERS) {
int nr;
infile >> nr;
persons[++lastUsed] = new Person(nr, infile);
}
}
}
Мой файл выглядит так:
1 Энди 180885 2 Майкл 230399
2 ответа
В вашем конструкторе у вас есть
cin.getline(fnavn, MAXTXT);
Итак, ваша программа ждет, когда вы что-то наберете. Если вы хотели получить имя из файла, тогда вам нужно
in.getline(fnavn, MAXTXT);
^^ ifstream object
Вы также собираетесь столкнуться с проблемой смешивания >>
с getline
, Вам нужно будет добавить
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
после infile >> nr;
в вашем цикле
strlen(fname + 1)
будет strlen(fname) - 1
если fname
имеет длину в один символ или более и не определяется, если fname имеет длину, равную нулю. Так должно быть strlen(fname) + 1
,
strlen(fnavn + 1)
имеет ту же проблему и должна быть strlen(fnavn) + 1
,