C++ C++;使用cin.getline()时程序挂起

C++ C++;使用cin.getline()时程序挂起,c++,getline,freeze,C++,Getline,Freeze,我正在制作一个程序,记录不同的人,我试图从文件中读取。我使用一个以ifstream文件为参数的构造函数,然后尝试从该文件读入数据。我可以读取第一行,它只是一个int(每个人的唯一数字),但是当我试图转到下一行并获取它时,程序挂起。有人知道为什么吗 #include <iostream> #include <fstream> #include <cstring> #include <cctype> #include <cstd

我正在制作一个程序,记录不同的人,我试图从文件中读取。我使用一个以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);
            }
        }
    }
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
常量int最大值=100;
常量int MAXTXT=80;
常数int DATELEN=7;
班主任{
私人:
国际天然气公司;
char*名字;
出生日期[日期];
公众:
人(){
字符fname[MAXTXT];
cout生日;cin.ignore();
}
人员(int n、ifstream和in){
nr=n;
字符fname[MAXTXT];
cin.getline(fname,MAXTXT);
firstName=新字符[strlen(fname)+1];
strcpy(名字,fname);
在>>生日;
}
无效显示(){
如果
fname
长度为一个或多个字符,并且如果fname长度为零个字符,则字符串(fname+1)
将是
strlen(fname)-1
。它应该是
strlen(fname)+1


strlen(fnavn+1)
也有同样的问题,在构造函数中应该是
strlen(fnavn)+1

cin.getline(fnavn, MAXTXT);
因此,您的程序正在等待您键入内容。如果您想从文件中获取名称,则需要

in.getline(fnavn, MAXTXT);
^^ ifstream object
您还将遇到的问题。您需要添加

infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
infle.ignore(std::numeric\u limits::max(),“\n”)

在while循环中的
infle>>nr;
之后。

我尝试将其更改为strlen(fname)+1,但它仍然挂起。有什么线索吗?但现在它将名称放在生日字段中。为什么呢?这个来自文件的输入让我心碎。@AndreasBH我添加了发生这种情况的原因。您应该阅读附加的链接以获得详细解释。
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n')