2015-05-27 2 views
0

Я новичок в StackExchange и C++, поэтому извиняюсь, если я недостаточно хорошо описываю проблему. Мне нужна помощь в выполнении домашних заданий. Я пытаюсь найти способ загрузить этот файл и сохранить его данные. Файл имеет разные типы данных, поэтому до сих пор я использовал шаблон struct для хранения всех значений, используя тройной вложенный цикл для сохранения данных в правильной переменной.Загрузка различных типов данных из текстового файла

Вот что такое .dat-файл, с комментариями, чтобы помочь описать, что происходит.

100A 2  // model number, 2 different versions of that model 

0 0 0  // number of quarters, dimes, and nickels 

5   //number of items in the vending machine 

1A 1034 5 // Code combonation, ID Number, Quantity 

1B 1000 10 

1C 1100 10 

1D 1123 20 

1E 1222 5 

0 0 0  // number of quarter, dimes, nickels in 2nd model 

7   // number of items in the second version of that model 

1A 2180 20 

1B 1283 20 

1C 3629 5 

1D 3649 3 

1E 4051 15 

1F 4211 1 

1G 5318 5 

100B 3  // New model, with 3 different versions of itself. 

2 10 5  //everything repeats like model 100A 

7 

Вот код, который я придумал

#include <fstream> 
#include <iostream> 
#include <iomanip> 
#include <string> 
using namespace std; 

struct VMdata 
{ 
    ifstream inFile; 
    string model[1]; 
    int version[1]; 
    int q[5]; 
    int d[5]; 
    int n[5]; 
    int size[5]; 
    string id[30]; 
    int code[30]; 
    int num[30]; 
    char dummy; 
}; 

int main() 
{ 

    VMdata New; 

    cout << fixed << setprecision(2) << showpoint; 

    New.inFile.open("machines.dat"); 



    cout << "Model Data" 
      << endl << endl;  



    int count1 = 0; 
    int count2= 0; 
    int count3 = 0; 
    for (int i = 0; i < 2; i ++) 
    { 
     cout << "i :" << count1 << endl; 
     New.inFile >> New.model[i] >> New.version[i]; // loads model number and number of versions i times 
     count1 = count1 + 1; 
     for (int j = 0; j < New.version[count1 -1]; j ++) 
     { 
      cout <<"j :" << count2 << endl; 
     New.inFile >> New.q[count2] >> New.d[count2] >> New.n[count2] >> New.size[count2]; // loads number of q, d, n, j times 
     count2 = count2 + 1; 
     for (int k = 0; k < New.size[count2 - 1]; k++) 
     { 
      cout << "k :" << count3 << endl; 
      New.inFile >> New.id[count3] >> New.code[count3] >> New.num[count3]; // loads id number, code number, and total number k times 
      count3 = count3 + 1; 
     } 

     } 
    } 
    New.inFile.close(); 

    count1 = 0; 
    count2= 0; 
    count3 = 0; 
    cout << endl; 

     for (int i = 0; i < 2; i ++) 
    { 
     cout << New.model[i] << setw(12) << New.version[i] << endl << endl; 
     count1 = count1 + 1; 
     for (int j = 0; j < New.version[count1 -1]; j ++) 
     { 
     cout << New.q[count2] << setw(12) << New.d[count2] << setw(12) << New.n[count2] << endl << setw(12) << New.size[count2] << endl; 
     count2 = count2 + 1; 
     for (int k = 0; k < New.size[count2 - 1]; k++) 
     { 
      cout << New.id[count3] << setw(12) << New.code[count3] << setw(12) << New.num[count3] << endl << endl; 
      count3 = count3 + 1; 
     } 

     } 
    } 



     return 0; 
} 

Вот мой тестовый выход.

100A   2 

3   15   0 // should be 0, 0, 0 

5 

1A  1034   5 

1B  1000   10 

1C  1100   10 

1D  1123   20 

1E  1222   5 

0   0   0 

    7 

1A  2180   20 

1B  1283   20 

1C  3629   5 

1D  3649   3 

1E  4051   15 

1F  4211   1 

1G  5318   5 

♥  ☻   3 // the heart and smile should be 100B lol 

2   10   5 

    7 

1A  2180   10 

1B  1283   10 

1C  3629   5 

1D  3649   3 

1E  4051   15 

1F  4211   10 

1G  3026   5 

5   6   3 

    6 

1A  6626   5 

1B  6155   5 

1C  5982   10 

1D  5573   3 

1E  5454   10 

1F  5336   50 

10   10   10 

5 

1A  1034   5 

1B  1000   5 

1C  1100   5 

1D  1123   5 

1E  1210   12 

Press any key to continue . . . 

Как вы можете видеть, количество кварталов, пятаков и никелевые неправильно для первой машины, а название модели является неправильным для 2-ой модели. Если у кого-то есть предложения, это было бы очень признательно.

+1

Для такого ввода я прочитал бы всю строку в виде строки, затем разобрал бы ее в разделенные переменные (структуры). – Tim3880

+0

Привет, Тим, можете ли вы привести пример чтения строки в виде строки и поместить ее в разные переменные? Я думал о том, чтобы делать что-то подобное, но я не был уверен, как это сделать, и не знаю, как преобразовать строку в int. Спасибо. – user3677752

+1

Извините, у меня нет примера здесь. Используйте getline для чтения строки в виде строки и используйте boost :: split, чтобы разделить строку на вектор строк, сканировать каждый элемент в векторе и преобразовать их в правильный тип и место назначения. – Tim3880

ответ

0

Похоже, что вы забиваете данные. Ваша структура выделяет только одну модель и одну версию, но индекс i принимает значения 0 и 1. Во второй раз, когда они предназначены для чтения, адрес переписывает ваши суммы монет.

Смежные вопросы