Hopeless_Noob
Hopeless_Noob

Reputation: 125

Loading Data from File to Data Structure in C++ and Interpreting It

Okay so this code is killing me.

My goal is to read data from a file where the data is separated by commas, then load that data into an array of structures that is supposed to be a list of "theater seats". The theater seats have certain characteristics, such as "location", "price", and "status". Price is self-explanatory. Location deals with the row and seat number of the "Seat". And status pertains to whether or not it's sold. After that, I have to interpret the data that I pulled from the data file to make a display THAT CAN be easily manipulated by the user if they input a certain choice. But that's not what I'm getting at in this question. My question is, what would be the best method to load my data structures from the data file?

Let me show you a bit of the data file that I'm reading from.

1, 1, 50, 0
1, 2, 50, 0
1, 3, 50, 0
1, 4, 50, 0

To explain the data file, the first number is the "row", second number is the seat number in that row, the third number is the price, and the final number ("0") stands for the seat being unsold. Had the seat been purchased, the final number would be 1.

Now, here's my code.

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <cstdlib>
#include <cstdio>
#include <conio.h>
using namespace std;

enum seatDimensions{ROWS = 10, SEATS_PER = 16};

//Structures
struct Location
{
    int     row;
    int     seatNumber; 
};  
struct Seat
{
    Location    seat_location[160];
    double      ticketPrice;
    int         status;
    int         patronID;
};

//GLOBALS
const int MAX = 16;

int main()
{
//arrays for our data
Seat        seatList[160];
//INDEX
int index = 1;
//filestream
fstream dataIn;

dataIn.open("huntington_data.dat",ios::in);
if(dataIn.fail())   //same as if(dataIn.fail())
{
    cout << "Unable to access the data file." << endl;
    return 999;
}

string temp;
getline(dataIn,temp,',');
seatList[index].seat_location[index].row = atoi(temp.c_str());
getline(dataIn,temp,',');
seatList[index].seat_location[index].seatNumber = atoi(temp.c_str());
getline(dataIn,temp,',');
seatList[index].ticketPrice = atof(temp.c_str());
getline(dataIn,temp,'\n');
seatList[index].status = atoi(temp.c_str());

    while(!dataIn.eof() && index < MAX)
    {
        index++;
        getline(dataIn,temp,',');
        seatList[index].seat_location[index].row = atoi(temp.c_str());
        getline(dataIn,temp,',');
        seatList[index].seat_location[index].seatNumber = atoi(temp.c_str());
        getline(dataIn,temp,',');
        seatList[index].ticketPrice = atof(temp.c_str());
        getline(dataIn,temp,'\n');
        seatList[index].status = atoi(temp.c_str());
    }
getch ();
return 0;
}

Now from here, I have to display whether or not the seats are TAKEN or not. The display should look like this, since none of the seats are taken yet.

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 // 16 across
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
// 10 deep

I know I'm not inputting my data in correctly, because I cannot seem to get this display no matter how I try to cout it. If you can tell where I'm going wrong, please tell me. Any suggestions would be amazing. Also, if you have any questions for me, just ask. I tried to be as specific as possible considering the question, but I know that it's still pretty vague. Please help.

EDIT: Thanks to those who answered my question. I ended up going a very different route with my data structure, but pulled a lot from the answers.

Upvotes: 2

Views: 4178

Answers (3)

N3Xg3N
N3Xg3N

Reputation: 97

is it an assignment?

i guess the way you are organizing your data in structure needs to be changed.

Take a structure maybe like this

struct Seat{
  double ticketPrice;
  int status;
  int patronId;
}

and have a two dimensional array like this

Seat seatList[10][16]; first dimension is (row number-1), second dimension is (seat number-1)

and read your data from file like this

string temp;
getline(dataIn,temp,',');
int row = atoi(temp.c_str());
getline(dataIn,temp,',');
int seatNumber = atoi(temp.c_str());
getline(dataIn,temp,',');
//check row and seatnumber > 0
seatList[row-1][seatNumber-1].ticketPrice = atof(temp.c_str());
getline(dataIn,temp,'\n');
seatList[row-1][seatNumber-1].status = atoi(temp.c_str());

Use two simple for loops to print your output from these structures.

Upvotes: 0

Steve Barnes
Steve Barnes

Reputation: 28370

You have the problem that each seat has a position in an array and then has an array of positions:

You need:

Location    seat_location[160];

changed to:

int seat_row;
int seal_num;

then:

seatList[index].seat_location[index].row = atoi(temp.c_str());

becomes:

seatList[index].seat_row = index / COLS ;  
seatList[index].seat_num = index % COLS ;

You may also like to consider actually arranging your data into a 2D array of the same dimensions as your seating.

BTW From my C background I would suggest reading the whole line and using sscanf, e.g.:

char temp[255];  // Use an appropriate maximum line length +3 for \r\n\0

fgets(dataIn, &temp);
sscanf(temp, "%d, %d, %d, %d", &.....

You could also consider implementing this with a regular expression.

Upvotes: 1

Slava
Slava

Reputation: 44258

Write a function that gets string of input and splits it into items:

std::vector<std::string> splitLine( const std::string &str );

Implement and debug it with string like "1, 1, 50, 0", make sure it returns vector of string with each number as separate element. Then read input line by line, split and convert each string to number separately. You will simplify the code and it will be much easier to make it work.

Upvotes: 0

Related Questions