使用 cin.getline() 时 C++ 程序挂起
C++ program hangs when using cin.getline()
我正在制作一个程序来跟踪不同的人,我试图从文件中读入该程序。我使用一个将 ifstream 文件作为参数的构造函数,然后尝试从文件中读取数据。我可以读取第一行,它只是一个整数(每个人的唯一编号),但是当我尝试转到下一行并获取它时,程序挂起。有谁知道为什么?
#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
Andy
180885
2
Michael
230399
strlen(fname + 1)
如果 fname
是一个字符长或更多,则 strlen(fname) - 1
将是 strlen(fname) - 1
并且如果 fname 是零字符长则不确定。应该是 strlen(fname) + 1
.
strlen(fnavn + 1)
有同样的问题,应该是 strlen(fnavn) + 1
.
在你的构造函数中你有
cin.getline(fnavn, MAXTXT);
所以您的程序正在等待您输入内容。如果您想从文件中获取名称,那么您需要
in.getline(fnavn, MAXTXT);
^^ ifstream object
您还将 运行 进入 mixing >>
with getline
的问题。您需要添加
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
在你的 while 循环中 infile >> nr;
之后。
我正在制作一个程序来跟踪不同的人,我试图从文件中读入该程序。我使用一个将 ifstream 文件作为参数的构造函数,然后尝试从文件中读取数据。我可以读取第一行,它只是一个整数(每个人的唯一编号),但是当我尝试转到下一行并获取它时,程序挂起。有谁知道为什么?
#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 Andy 180885 2 Michael 230399
strlen(fname + 1)
如果 fname
是一个字符长或更多,则 strlen(fname) - 1
将是 strlen(fname) - 1
并且如果 fname 是零字符长则不确定。应该是 strlen(fname) + 1
.
strlen(fnavn + 1)
有同样的问题,应该是 strlen(fnavn) + 1
.
在你的构造函数中你有
cin.getline(fnavn, MAXTXT);
所以您的程序正在等待您输入内容。如果您想从文件中获取名称,那么您需要
in.getline(fnavn, MAXTXT);
^^ ifstream object
您还将 运行 进入 mixing >>
with getline
的问题。您需要添加
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
在你的 while 循环中 infile >> nr;
之后。