Why is the section to write the text file to the screen not producing any output?

Why is the section to write the text file to the screen not producing any output?
It works fine when isolated on its own, the code is at lines 140-153.

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<fstream>
#include<iomanip>
#include<stdlib.h>

using namespace std;

struct addressCard
{
string name;
string street;
string town;
string county;
string postCode;
string country;
int telephoneNumber;
};


// write to an output stream, object into a stream
ostream& operator<< ( std::ostream& stm, const addressCard& a )
    // write one string per line, end with a blank line
{
    return stm << a.name << '\n' << a.street << '\n' << a.town << '\n' 
<< a.county << '\n' << a.postCode << '\n' << a.country << "\n\n" ;
}

bool genericSort(const addressCard &obj1, const addressCard &obj2)
{
    if (obj1.name == obj2.name)
    {
        return obj1.street < obj2.street;
    }
    else if (obj1.name == obj2.name && obj1.street == obj2.street)
    {
        return obj1.postCode < obj2.postCode;   
    }
    else if (obj1.name == obj2.name && obj1.street == obj2.street
    && obj1.town == obj2.town)
    {
        return obj1.town < obj2.town;   
    }
    else if (obj1.name == obj2.name && obj1.street == obj2.street
    && obj1.town == obj2.town && obj1.county == obj2.county)
    {
        return obj1.postCode < obj2.postCode;   
    }
    else if (obj1.name == obj2.name && obj1.street == obj2.street
    && obj1.town == obj2.town && obj1.county == obj2.county
    && obj1.postCode == obj2.postCode)
    {
        return obj1.country < obj2.country;   
    }

}

const unsigned numberOfPeople = 3;

int main()
{
vector<addressCard> people(numberOfPeople);

for (vector<addressCard>::size_type i = 0; i!=numberOfPeople; ++i)
{
cout <<"Person# " <<i+1<< " name: " << endl;
getline(cin,people[i].name);

cout <<"Person# " <<i+1<< " street: " << endl;
getline(cin,people[i].street);

cout <<"Person# " <<i+1<< " town: " << endl;
getline(cin,people[i].town);

cout <<"Person# " <<i+1<< " county: " << endl;
getline(cin,people[i].county);

cout <<"Person# " <<i+1<< " postCode: " << endl;
getline(cin,people[i].postCode);

cout <<"Person# " <<i+1<< " country: " << endl;
getline(cin,people[i].country);

}

cout <<"\n\n";


cout <<"Sorting....\n";

sort(people.begin(), people.end(), genericSort);

cout <<"Printing results....\n";

for (addressCard &n : people)
{
cout << n.name << endl;
cout << n.street << endl;
cout << n.town << endl;
cout << n.county << endl;
cout << n.postCode << endl;
cout << n.country << endl;

cout <<"\n\n";
}

cout <<"Printing raw vector....\n";

for (vector<addressCard>::size_type i = 0; i!=numberOfPeople; ++i)
{
cout <<people[i].name << endl;

cout <<people[i].street << endl;

cout << people[i].town << endl;

cout <<people[i].county << endl;

cout << people[i].postCode << endl;

cout <<people[i].country << endl;

cout <<"\n\n";

}

cout <<"Writing to file....\n";

const string file_name = "data.txt" ;

        ofstream file(file_name) ;
        for( const addressCard& a : people ) file << a ; //vector 
//favourites of class type addresssCard, object a iterates vector
// and writes it to text file

cout<<"Writing text file to screen...\n";

    string x;
    ifstream inFile;

    inFile.open("data.txt");
    if (!inFile) {
        cout << "Unable to open file";
        exit(1); // terminate with error
    }

    while (getline(inFile,x)) {
cout << x << endl ;
}

    inFile.close();

return 0

}
You still have the file open as an ofstream from line 133.
One way to fix this is to only contain the ofstream within a local scope so that it closes automatically.

1
2
3
4
5
6
7
8
9
10
11
12
    const string file_name = "data.txt" ;
    
    {
        ofstream file(file_name) ;
        for( const addressCard& a : people )
            file << a; 
    } // file.close() called automatically here.

    cout<<"Writing text file to screen...\n";
  
    // ...


PS: Please work on having consistent indentation/spacing. Your code is very hard to read.
Last edited on
also try return(1) instead of exit(1). Exit is like pulling the cord out of the wall, return is like shutting down. It isnt the problem here but exit COULD prevent seeing the error message you tried to write, killing all processing before the buffered IO was actually printed to the screen. Alternatively you could flush cout before exiting just to be sure.
Topic archived. No new replies allowed.