Ваш подход кажется правильным с учетом предоставленной вами информации.
Я предполагаю, что вы создадите класс примерно так:
class device {
public:
int id;
vector<interaction> interactions;
void add_interaction(interaction add_me); // uses vector::insert
};
с
typedef struct interaction_t {
int other_device_id;
int start_time;
int end_time;
} interaction;
В этот момент вы сможете прочитать в файле по одной строке за раз и извлечь данные.
device* pDev = NULL;
interaction new_interaction;
ifstream ifs( "data.dat" );
char temp[MAX_LINE_LENGTH+1];
int id, other_id, start, end;
while(ifs.getline(temp, MAX_LINE_LENGTH)) {
sscanf(temp, "%i\t%i\t%i\t%i",
&id,
&new_interaction.other_device_id,
&new_interaction.start_time,
&new_interaction.end_time);
pDev = find_device_by_id(id);
pDev->add_interaction(new_interaction);
}
Код не проверен и предназначен только для иллюстрации, но вы можете понять это. Трюк заключался в написании функции find_device_by_id
(возвращал бы указатель на объект device
с соответствующим полем id
). Это не должно требовать слишком больших затрат памяти на строку ввода; если ваши входные файлы огромны, вы, возможно, не сможете хранить данные в памяти, и вам, возможно, придется хранить их в базе данных.