Reading file into array of struct c++
Solution 1
Your file has 15
lines, and so you can only read through 15 lines of data. You are using the variable SIZE
to control how many lines should be read.
The problem is that SIZE
is 50
! It is not 15
. When you are trying to read past the end of file, the input will not be read past the 16th line. So, the variables after index 15
will be uninitialized, which is undefined.
Either increase the amount of lines in your file to 50
, or change SIZE
to be 15
.
Solution 2
As the other answer by @Rackete1111 states, you specified too many items, and had your loop that reads the data go over the actual number of items in your file.
Having said this, there really isn't anything wrong (besides wasting space if you presize your array too large) with overstating how many records you have, as long as you write the read loop correctly. The following is the way to write the loop, even if you made the "mistake" of stating 50 items instead of 15:
#include <iostream>
#include <string>
#include <iostream>
using namespace std;
int main(){
const int SIZE=50;
int i;
struct Records {
string firstname;
string secondname;
float test1mark;
float midtestmark;
float annualmark;
};
Records record[SIZE];
ifstream in("Data.txt");
int recCount = 0; // keep track of actual number of records
// loop until we reach the end of file, or until we hit SIZE records,
// whichever comes first
while (!in.eof() && recCount < SIZE)
{
in >> record[recCount].firstname >> record[recCount].secondname
>>record[recCount].test1mark >> record[recCount].midtestmark >> record[recCount].annualmark ;
++recCount;
}
// now recCount == 15 if you have 15 items.
Note we have a while
loop that will read until the limit is reached (50), or we hit the end-of-file.
Avisaki Usamate
1st Year Undergraduate in Ba. of Computer Science and Electrical Engineering. Learning C++ language.
Updated on December 24, 2020Comments
-
Avisaki Usamate over 3 years
I am trying to read a .txt file into an array of struct in this program and display the content.
The file looks like this:Smith Jack 60 45 98 Harry Hisk 45 40 78 Kay Jacob 35.5 23 45 Dos hed 23 20 35 Noa Tom 55 12 32 Joe Peni 57 49 78 Vin San 25.6 23 65.5 Jes Dan 24.3 12 78 Zi Lee 56 49 99 Angi Dev 57 48 97 Donald David 60 50 96 Davis Lal 47 47 80 Alvis Sen 56 46 85 Jack Jill 45 45 75 Messy Lionel 60 49 100
The code I'm running:
#include <iostream> #include <string> #include <fstream> using namespace std; int main(){ const int SIZE=50; int i; struct Records { string firstname; string secondname; float test1mark; float midtestmark; float annualmark; }record[SIZE]; ifstream in("Data.txt"); if (!in){ cerr << "File can't be opened! " << endl; system("PAUSE"); exit(1); } for (int i=0; i < SIZE; i++){ in >> record[i].firstname >> record[i].secondname >>record[i].test1mark >> record[i].midtestmark >> record[i].annualmark ; } for (int i=0;i< SIZE;i++) { cout << record[i].firstname<<" "; cout << record[i].secondname<<" "; cout << record[i].test1mark<<" "; cout << record[i].midtestmark << " "; cout << record[i].annualmark << " "; } return 0; }
The output I'm getting:
Smith Jack 60 45 98 Harry Hisk 45 40 78 Kay Jacob 35.5 23 45 Dos hed 23 20 35 Noa Tom 55 12 32 Joe Peni 57 49 78 Vin San 25.6 23 65.5 Jes Dan 24.3 12 78 Zi Lee 56 49 99 Angi Dev 57 48 97 Donald David 60 50 96 Davis Lal 47 47 80 Alvis Sen 56 46 85 Jack Jill 45 45 75 Messy Lionel 60 49 100 nan 0 8.94237e-039 4.36192e-039 0 -2.3511e-038 0 0 -2.3511e-038 0 0 0 1.32253e-038 0 1.32251e-038 4.2039e-045 0 -2.11122e+037 1.32251e-038 0 3.21276e-039 1.4013e-045 0 -2.3511e-038 1.4013e-045 0 3.76158e-037 0 0 3.76158e-037 0 0 1.12104e-044 4.36195e-039 0 4.36194e-039 3.57331e-043 0 6.0615e-039 0 0 3.21276e-039 4.2039e-045 0 6.41272e-039 1.12104e-044 0 6.63812e-039 4.36205e-039 0 -2.75237e+038 0 0 6.59812e-039 6.63426e-039 0 1.4013e-045 0 0 6.47961e-039 3.21319e-039 0 3.21319e-039 6.59812e-039 0 3.21299e-039 8.40779e-045 2.24208e-044 6.01433e-039 6.6045e-039 0 2.54408e-029 0 0 6.6045e-039 0 0 6.43946e-039 5.88656e-039 0 -4.12495e+011 0 0 0 5.88656e-039 0 2.54408e-029 nan nan 6.43029e-039 0 0 0 5.93823e-039 0 -4.12495e+011 0 0 0 5.93823e-039 0 5.74532e-044 nan nan 5.93837e-039
Process exited after 0.05447 seconds with return value 0
Press any key to continue . . .Can someone tell me what's wrong with it? I've tried using pointers but it just got worse. -Beginner