c++ Чтение вектора из файла

В текстовом файле записаны построчно векторы 0 и 1: (пример, 3 вектора) 00111001 10100100 10011010

Не получается прочитать даже первый вектор - долгая сборка, видимо память грузится. Пробую читать символы до конца строки \n, код ниже.

vector <bool> vec;
if (vec_file.is_open()) 
    {
        while (char ch = vec_file.get() != '\n')
        {
            vec_file.seekg(-1); // if char is not \n then go back and read as a boolean

            bool temp = vec_file.get();
            vec.push_back(temp);    //add vector's element

        }
    }
    vec_file.close();
    print_vec(vec); //функция вывода вектора сама по себе работает

Выходит что-то очень-очень долгое. Подскажите, чем я так память огорчаю?..


Ответы (1 шт):

Автор решения: Павел Ериков
  1. char ch = vec_file.get() != '\n' этой строчкой вы каждую итерацию получаете символ из файла и сравниваете его с \n а результат сравнения заносите в ch и получается, что пока вы не дошли до \n у вас ch будет = 1.

    То что вы хотели реализовать выглядит примерно таким образом:

    char ch;
    while ((ch = vec_file.get()) != '\n')
    

    Вы сначала присваиваете ch считанный символ из файла, а потом уже проверяете его с \n.

  2. Далее внутри цикла я вообще не понял, вашу реализацию.

    Вы уже прочитали символ в ch все что вам остается это добавить его в vec как bool. Но т.к. код '0' и '1' это 48 и 49 соответственное (см. таблица ascii), то написав такую строчку:

    bool temp = ch;
    

    temp всегда будет равна единице, т.к. true это все, что не 0. В нашем случае это 48 и 49. Так что вам нужно получить из символов '0' и '1' коды 0 и 1 соответственно.

    Чтобы получить из символа '0' с кодом 48 код 0 нужно, логично, отнять 48 или '0' и уже его добавлять в вектор, то есть:

    //vec.push_back(ch - 48); Равносильно строчке ниже
    vec.push_back(ch - '0'); //Проще для понимания
    

Чтобы вы не запутались, вот пример цикла, которые считывает символы до \n занося 0 и 1 в вектор:

char ch;
while ((ch = vec_file.get()) != '\n') {
    vec.push_back(ch - '0');
}

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

→ Ссылка