在C ++中将数据从文件加载到数据结构并解释它

时间:2013-10-21 04:42:49

标签: c++ file data-structures

好的,所以这段代码正在杀了我。

我的目标是从用逗号分隔数据的文件中读取数据,然后将该数据加载到应该是“影院席位”列表的结构数组中。剧院座椅具有某些特征,例如“位置”,“价格”和“状态”。价格不言自明。位置处理“座位”的行和座位号。并且状态与是否已售出有关。之后,我必须解释从数据文件中提取的数据,以便在用户输入特定选项时可以轻松地操作显示。但这不是我在这个问题上得到的。 我的问题是,从数据文件加载数据结构的最佳方法是什么?

让我向您展示一下我正在阅读的数据文件。

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

为了解释数据文件,第一个数字是“行”,第二个数字是该行中的座位号,第三个数字是价格,最后一个数字(“0”)代表未售出的座位。如果座位已被购买,最终的数字将是1.

现在,这是我的代码。

#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;
}

现在从这里开始,我必须显示座位是否已被取消。 显示器看起来应该是这样的,因为还没有座位。

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

我知道我没有正确输入我的数据,因为无论我如何尝试这样做,我似乎无法获得这种显示。如果你能告诉我哪里出错了,请告诉我。任何建议都会很棒。 另外,如果您对我有任何疑问,请询问。考虑到这个问题,我试图尽可能具体,但我知道它仍然很模糊。 请帮忙。

编辑:感谢那些回答我问题的人。我最终使用我的数据结构走了一条完全不同的路线,但从答案中汲取了很多。

3 个答案:

答案 0 :(得分:1)

您遇到的问题是每个座位在数组中都有一个位置,然后有一个位置数组:

你需要:

Location    seat_location[160];

更改为:

int seat_row;
int seal_num;

然后:

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

变为:

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

您可能还想考虑将数据实际安排到与座位尺寸相同的2D阵列中。

BTW从我的C背景中我建议阅读整行并使用sscanf,例如:

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

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

您还可以考虑使用正则表达式实现此功能。

答案 1 :(得分:0)

编写一个获取输入字符串并将其拆分为项目的函数:

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

使用类似“1,1,50,0”的字符串实现和调试它,确保它返回字符串的向量,每个数字作为单独的元素。然后逐行读取输入,拆分并将每个字符串分别转换为数字。您将简化代码,使其更加容易。

答案 2 :(得分:0)

是作业吗?

我猜你在结构中组织数据的方式需要改变。

采取可能像这样的结构

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

并有一个像这样的二维数组

Seat seatList[10][16]; 第一维为(row number-1),第二维为(seat number-1)

并从文件中读取您的数据

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());

使用两个简单的for循环来打印这些结构的输出。