2013-12-09 5 views
0

У меня есть неизвестное число INT переменных в текстовом файле, все я знаю, что число переменных будет кратно 6.C++ контейнер Расщепление

Я хочу, чтобы прочитать эти файлы, чтобы контейнер, и разделить их на меньшие контейнеры, где каждый контейнер принимает 6 значений.

Например, если в текстовом файле имеется 30 переменных, я хочу 5 контейнеров, каждый из которых содержит 6 переменных. И они должны быть в том порядке, в котором они находятся в файле, т. Е. В первом контейнере первые шесть значений.

Я прочитал файлы в списке, и вектор на данный момент, и блуждал, какой из них больше подходит. Я прочитал о функции split, но после осмотра я не смог успешно применить его к одной из этих попыток, главным образом потому, что я не знаю, сколько меньших контейнеров мне понадобится

Это мой код до сих пор:

Vector метод

std::vector<int> Ticket; 

std::ifstream fin (username + "Ticket.txt"); 
    while (!fin.eof()) 
    { 
     fin >> num; 
     Ticket.push_back(num); 
    } 
    fin.close(); 

Ticket.shrink_to_fit(); 

метод Список

std::list<int> Ticket1; 

std::ifstream fin (username + "Ticket.txt"); 
    while (!fin.eof()) 
    { 
     fin >> num; 
     Ticket1.push_back(num); 
    } 
    fin.close(); 

В качестве альтернативы, если бы я мог как-то читать 6 значений из файла прямо в меньшие контейнеры и продолжать делать это до конца файла, следовательно, пропускать большой контейнер, который был бы потрясающим.

+1

Оба метода нарушены. Вы не можете использовать 'eof()'. Это никогда не бывает правильным. –

+1

Какова Ваша фактическая структура данных? Имеют ли эти 6 целых чисел разные вещи или шесть одинаковых вещей? Кроме того, что сказал @KerrekSB - правильный способ читать, пока вы не можете, это 'while (fin >> num)', без использования 'eof()'. –

+0

Хорошо, спасибо за отзыв о eof() и @SebastianRedl, это 6 случайных цифр в диапазоне 1 - 66 – user3001499

ответ

2

Вы можете использовать вектор векторов.

std::vector< std::vector<int> > Ticket; 
std::vector<int> newVector;  

std::ifstream fin (username + "Ticket.txt"); 
while (fin >> num) 
{ 
    newVector.push_back(num); 

    // if the vector is full, then insert it and start afresh 
    if (newVector.size() == 6) { 
    Ticket.push_back(newVector); 
    newVector.clear(); 
    }  
} 
fin.close(); 

В конце вектора билетов должен содержать все необходимые векторы.

Для печати каждый вектор на консоли, использовать два вложенных цикла:

for (int i = 0; i < Ticket.size(); i++) { // outer vector 
    for (int j = 0; j < Ticket[i].size(); j++) { // inner vectors 
    std::cout << Ticket[i][j] << " "; 
    } 
    std::cout << "\n"; 
} 
+0

@Abhinshek благодарит, что будет вызываться каждый из отдельных векторов, так как мне нужно получить к ним доступ по отдельности позже программа? – user3001499

+0

Доступ к векторам возможен, как правило, как Ticket [0], Ticket [1], ... Ticket [Ticket.size() - 1] –

+0

, и я также не совсем уверен, что это за конечный, если на самом деле это утверждение? – user3001499

0

я хотел бы использовать функцию C Fscanf()

Вы можете использовать формат и читать 6 цифр сразу.

fscanf(FILE,"%i %i %i %i %i %i",&var1,&var2,&var3,&var4,&var5,&var6) 

Тогда вам просто нужно обрабатывать контейнер, создавая один перед и читать непосредственно к нему или справляясь значения, если они есть то, что вы ожидаете.

1

Если создать временный аккумулятор, и ваш конечный пункт назначения:

vector<int> temp ; 
vector<vector<int>> package ; 

Тогда просто заполнить temp, пока его полный и нажимать на конец package:

while (fin >> num) 
{ 
    temp.push_back(num) ; 
    if (temp.size() == MyDesiredSize) { package.push_back(temp) ; temp.clear() ; } 
} 

Когда вы push_back на package, он сделает копию, поэтому вы можете очистить temp.

1

Вам нужно, чтобы значения внутри контейнера были смежными, так как они находятся внутри c-массива, или вам нужно иметь больше возможностей для управления распределением памяти с помощью функции-члена-резерва std :: vector? Если нет, то рассмотрите deque или list over vector. http://www.cplusplus.com/reference/deque/deque/

Вы также используете массив фиксированного размера, если у вас есть компилятор C++ 11, который его поддерживает. http://www.cplusplus.com/reference/array/array/

Например, вы можете настроить такой контейнер, чтобы настроить список массивов.

std::list<std::array<int, 6>> containersOfSix; 

С другой стороны, вы могли бы использовать одну из функций INSERTER, если вы предпочли бы обе части контейнера, чтобы быть динамичным.
http://www.cplusplus.com/reference/iterator/istream_iterator/ http://www.cplusplus.com/reference/iterator/insert_iterator/

Рассмотрим чтение через этот материал, и играл вокруг с некоторыми из этих вариантов. Это может привести к поиску других потоков, связанных с ними, что поможет вам найти более конкретные примеры.

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