如何从一个有两列的.txt文件中创建并行数组?

问题描述 投票:0回答:1

我正在做一个任务,我必须创建一个程序,让用户在购买新车时可以个性化选择。我有一个有两列的.txt文件,一列是价格(double),另一列是选项(string)。我想有两个平行的数组,我可以使用,这样用户就可以输入字符串选项和一个向量将自动更新汽车的价格。这是.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的新手!

c++ arrays parallel-arrays
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.

© www.soinside.com 2019 - 2024. All rights reserved.