Доброго времени суток!
Ломаю, по незнанию, голову над следующим вопросом. Ниже такой код (из книги Лафоре ): объект записывает/читает записанную в файл информацию (имя/возраст). Прописываются объекты классов ofstream/ifstream. И ещё подсчитывается количество записанных в файл людей.
Я не знаю почему, если я пропишу один объект класса fstream, программа не работает. Данные записываются, но когда нужно
их прочитать данные не выводятся нормально. Вместо заданного количества записей чтение и вывод данных на экран происходят бесконечно. То есть ошибка где-то на этапе подсчёта количества записанных персон, строка 35.
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| #include <fstream> //for file streams
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
class person //class of persons
{
protected:
char name[40]; //person's name
int age; //person's age
public:
void getData(void) //get person's data
{
cout << "\n Enter last name: "; cin >> name;
cout << " Enter age: "; cin >> age;
}
void showData(void) //display person's data
{
cout << "\n Name: " << name;
cout << "\n Age: " << age;
}
void diskIn(int); //read from file
void diskOut(); //write to file
static int diskCount(); //return number of
// persons in file
};
//--------------------------------------------------------------
void person::diskIn(int pn) //read person number pn
{ //from file
ifstream infile; //make stream
infile.open("PERSFILE.DAT", ios::binary); //open it
infile.seekg( pn*sizeof(person) ); //move file ptr
infile.read( (char*)this, sizeof(*this) ); //read one person
}
//--------------------------------------------------------------
void person::diskOut() //write person to end of file
{
ofstream outfile; //make stream
//open it
outfile.open("PERSFILE.DAT", ios::app | ios::binary);
outfile.write( (char*)this, sizeof(*this) ); //write to it
}
//--------------------------------------------------------------
int person::diskCount() //return number of persons
{ //in file
ifstream infile;
infile.open("PERSFILE.DAT", ios::binary);
infile.seekg(0, ios::end); //go to 0 bytes from end
//calculate number of persons
return (int)infile.tellg() / sizeof(person);
}
////////////////////////////////////////////////////////////////
int main()
{
person p; //make an empty person
char ch;
do { //save persons to disk
cout << "Enter data for person:";
p.getData(); //get data
p.diskOut(); //write to disk
cout << "Do another (y/n)? ";
cin >> ch;
} while(ch=='y'); //until user enters 'n'
int n = person::diskCount(); //how many persons in file?
cout << "There are " << n << " persons in file\n";
for(int j=0; j<n; j++) //for each one,
{
cout << "\nPerson " << j;
p.diskIn(j); //read person from disk
p.showData(); //display person
}
cout << endl;
return 0;
} |
|
А это код, который не работает.
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| #include <fstream> //for file streams
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
class person //class of persons
{
protected:
char name[40]; //person's name
int age; //person's age
public:
void getData(void) //get person's data
{
cout << "\n Enter last name: "; cin >> name;
cout << " Enter age: "; cin >> age;
}
void showData(void) //display person's data
{
cout << "\n Name: " << name;
cout << "\n Age: " << age;
}
void diskIn(int); //read from file
void diskOut(); //write to file
static int diskCount(); //return number of
// persons in file
};
//--------------------------------------------------------------
void person::diskIn(int pn) //read person number pn
{ //from file
fstream infile; //make stream
infile.open("PERSFILE.DAT", ios::binary); //open it
infile.seekg( pn*sizeof(person) ); //move file ptr
infile.read( (char*)this, sizeof(*this) ); //read one person
}
//--------------------------------------------------------------
void person::diskOut() //write person to end of file
{
fstream outfile; //make stream
//open it
outfile.open("PERSFILE.DAT", ios::app | ios::binary);
outfile.write( (char*)this, sizeof(*this) ); //write to it
}
//--------------------------------------------------------------
int person::diskCount() //return number of persons
{ //in file
fstream infile;
infile.open("PERSFILE.DAT", ios::binary);
infile.seekg(0, ios::end); //go to 0 bytes from end
//calculate number of persons
return (int)infile.tellg() / sizeof(person);
}
////////////////////////////////////////////////////////////////
int main()
{
person p; //make an empty person
char ch;
do { //save persons to disk
cout << "Enter data for person:";
p.getData(); //get data
p.diskOut(); //write to disk
cout << "Do another (y/n)? ";
cin >> ch;
} while(ch=='y'); //until user enters 'n'
int n = person::diskCount(); //how many persons in file?
cout << "There are " << n << " persons in file\n";
for(int j=0; j<n; j++) //for each one,
{
cout << "\nPerson " << j;
p.diskIn(j); //read person from disk
p.showData(); //display person
}
cout << endl;
return 0;
} |
|