2

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

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

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

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

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

编辑:感谢那些回答我问题的人。我最终对我的数据结构采取了一条非常不同的路线,但从答案中得到了很多。

4

3 回答 3

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 ;

您可能还想考虑将数据实际排列到与座位尺寸相同的二维数组中。

顺便说一句,从我的 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", &.....

您还可以考虑使用正则表达式来实现这一点。

于 2013-10-21T05:01:15.543 回答
0

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

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

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

于 2013-10-21T05:03:31.697 回答
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 循环从这些结构中打印输出。

于 2013-10-21T05:06:24.610 回答