0

我正在做一个任务,我必须创建一个程序,用户可以个性化购买新车的选项。我有一个包含两列的 .txt 文件,一列有价格(双),另一列有选项(字符串)。我想要两个可以使用的并行数组,以便用户可以输入字符串选项,并且向量将自动更新汽车的价格。这是 .txt 文件及其内容。

5000.0 Leather Seats
1000.0 DVD System
800.0 10 Speakers
1400.0 Navigation System
500.0 CarPlay
500.0 Android Auto
2000.0 Lane Monitoring
800.0 3/36 Warranty
999.0 6/72 Warranty
1500.0 Dual Climate
225.0 Body Side Molding
49.0 Cargo Net
87.0 Cargo Organizer
700.0 450W Audio
1000.0 Heated Seats

编辑:我很抱歉没有提供足够的信息,我是新来的。所以这是我到目前为止的代码:

void optionsLoop();
void printOptions();
char selectModel();

///function prototypes

int main(int argc, char const *argv[]) 
{
    ifstream inStream;
    int menuChoice;
    char model;
    const int SIZE = 30;



inStream.open("options.txt");
    if (inStream.fail())
    {
        cout << "Error opening file";
        exit (0);
    }

 do 
   {
    optionsLoop ();
    cout << "Enter choice: ", cin >> menuChoice; 
    switch (menuChoice)
    {
        case 1: 
        model = selectModel();

        break;

        case 2:
        printOptions();
    }
   }
   while(menuChoice !=6);


    return 0;
}/// main


void optionsLoop()
{
        cout << " " <<endl;
        cout << "Bob Cat Auto Dealership" << endl;
        cout << "Please select choice" << endl;
        cout << "1. Select a model (E, L, X)" << endl;
        cout << "2. Display available options and prices" << endl; 
        cout << "3. Add an option" << endl;
        cout << "4. Remove an option" << endl;
        cout << "5. Cancel Order" << endl;
        cout << "6. Quit" << endl;

}


char selectModel() 
{   

    char model;
    cout << "Enter the model (E, L, X ) : ";
    cin >> model;
    model = toupper(model);
    return model;


}


所以我有一个名为 options.txt 的文件,它有两列,右列是选项的名称,左列是价格。我使用 ifstream 将信息读入程序。

我想将该文件作为两个并行数组读取,以便可以在程序的其余部分中使用它。

例如对于选项循环中的选项 1,我需要让用户选择他/她想要的型号,然后显示起始价格。用户在菜单选项 3 中选择的任何选项都会增加汽车的价格。因此,如果用户输入真皮座椅,价格将增加 5000 美元。这就是为什么我需要它们并行。

我希望这可以澄清事情。我是数组和stackoverflow的新手!

4

1 回答 1

0

更喜欢使用std::vector而不是数组。
更喜欢使用std::vector<structure>而不是并行数组。
更喜欢在互联网上研究“C++ 读取空间分隔数组”。

开始了:

double some_value;
std::string name;
std::vector<double> value_database;
std::vector<string> name_database;
//...
while (input_file >> some_value)
{
    std::getline(input_file>>skipws, name);
    value_database.push_back(value);
    name_database.push_back(name);
}

std::getline(input_file>>skipws,通过 StackOverflow 搜索找到了。:-)

编辑:必须使用数组
对于那些必须使用数组的指令类,这里有另一种方法:

double value_again;
std::string name_again;
unsigned int array_capacity = 8U;
double * value_array = new double[array_capacity];
std::string * name_array = new std::string[array_capacity];
unsigned int records_read = 0U;
while (input_file >> value_again)
{
  char separator;
  input >> noskipws >> separator;
  std::getline(input, name_again);
  ++records_read;
  if (records_read > array_capacity)
  {
    unsigned int new_capacity = array_capacity * 2;
    double * larger_value_array = new double [new_capacity];
    std::copy(&value_array[0], &value_array[array_capacity], &larger_value_array[0]);
    delete [] value_array;
    value_array = larger_value_array;
    std::string * larger_name_array = new std::string [new_capacity];
    std::copy(&name_array[0], &name_array[array_capacity], &larger_name_array[0]);
    delete [] name_array;
    name_array = larger_name_array;
    array_capacity = new_capacity;
  }
  value_array[records_read] = value_again;
  name_array[records_read] = name_again;
  ++records_read;
}

上面的代码片段不断检查读取的记录与数组的容量。如果数组已满,则分配新数组,将旧数据复制到新数组,然后删除旧数组。这种内存管理已经(在幕后)使用std::vector.

于 2020-06-15T21:01:54.053 回答