Хорошо читать только первую строку двоичного файла - PullRequest
0 голосов
/ 03 декабря 2018

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

Структура хорошая.Все, кроме чтения, работает хорошо.Это функции чтения и записи:

void saveVectorBin(vector<Complex> &v, const string filename) {
    ofstream output;
    output.open(filename, ios::binary);
    if (output)
    {
        for (auto i: v) {
            output.write(reinterpret_cast<char*> (&i), sizeof(i));
            output << endl;
        }
        cout << "Wektor zapisany do pliku " << filename << endl;
        output.close();
    }
    else cout << endl << "BLAD TWORZENIA PLIKU BIN" << endl;
}

vector<Complex> readComplexVectorBin(const string &filename) {
    vector<Complex> v;
    ifstream input;
    input.open(filename, ifstream::binary);
    if (input) {
        Complex line;
        while (input.read(reinterpret_cast<char*> (&line), sizeof(Complex))) {
            v.push_back(Complex(line));
        }
        input.close();
    }
    else cout << endl << "BLAD ODCZYTU PLIKU" << endl;
    return v;
}

Должно отображаться:

26.697 + 7.709i
20.133 + 23.064i
9.749 + 8.77i 

Вместо этого отображается:

26.697 + 7.709i
1.43761e-57 + 1.83671e-43i
1.26962e+306 + -2.39343e-259i

1 Ответ

0 голосов
/ 03 декабря 2018

Ваша проблема заключается в том, что вы вставляете новую строку в двоичный файл.

output << endl;

добавляет в файл данные, которые

while (input.read(reinterpret_cast<char*> (&line), sizeof(Complex))) {
    v.push_back(Complex(line));
}

не учитывается.Вам нужно либо избавиться от output << endl; в цикле записи (самое простое решение), либо прочитать и удалить новую строку в цикле чтения (самое сложное решение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...