好的,所以这段代码正在杀了我。
我的目标是从用逗号分隔数据的文件中读取数据,然后将该数据加载到应该是“影院席位”列表的结构数组中。剧院座椅具有某些特征,例如“位置”,“价格”和“状态”。价格不言自明。位置处理“座位”的行和座位号。并且状态与是否已售出有关。之后,我必须解释从数据文件中提取的数据,以便在用户输入特定选项时可以轻松地操作显示。但这不是我在这个问题上得到的。 我的问题是,从数据文件加载数据结构的最佳方法是什么?
让我向您展示一下我正在阅读的数据文件。
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
我知道我没有正确输入我的数据,因为无论我如何尝试这样做,我似乎无法获得这种显示。如果你能告诉我哪里出错了,请告诉我。任何建议都会很棒。 另外,如果您对我有任何疑问,请询问。考虑到这个问题,我试图尽可能具体,但我知道它仍然很模糊。 请帮忙。
编辑:感谢那些回答我问题的人。我最终使用我的数据结构走了一条完全不同的路线,但从答案中汲取了很多。答案 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循环来打印这些结构的输出。