C ++ читает бинарный файл char by char - PullRequest
0 голосов
/ 03 июня 2018

У меня есть задание сохранять данные некоторых объектов в определенном порядке их элементов данных, я постараюсь упростить.Рассмотрим этот конструктор базового класса из двоичного файла.(Обратите внимание, что я не выбрал использовать char *).

Base(ifstream & in_file) {
    int n;
    in_file.read((char *)&n, sizeof(n));
    m_var = new char[n + 1];
    in_file.read(m_var, n);
    m_var[n] = '\0';
    in_file.read((char *)&m_intvar, sizeof(m_intvar));
}

Он должен инициализировать m_var (char *) и другую целочисленную переменную.Этот код работает, хотя он запрашивает , чтобы сохранить длину символа * для меня, чтобы выделить память.

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

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

1 Ответ

0 голосов
/ 04 июня 2018

После консультации с cppreference.com я получаю следующее:

#include <fstream>
#include <iostream>
#include <cstring>

class Base
{
public:
    Base(std::istream & in_file) { // NOTE: changed to istream to allow reading from any stream not just files
        in_file.read((char *)&n, sizeof(n));
        char buffer[1024];
        in_file.get(buffer, sizeof(buffer), '\n');
        size_t gcount = in_file.gcount();
        if (in_file.get() != '\n')
        {
            throw std::runtime_error("binary string to long"); // you may want to implement a loop here using peek() to check for newline
        }
        m_var = new char[gcount];
        std::copy(buffer, buffer + gcount, m_var);
    }

    Base(int num, const char* strg)
        : n(num)
        , m_var(strdup(strg))
    {
    }

    bool operator == (const Base& rhs)
    {
        return n == rhs.n && strcpy(m_var, rhs.m_var);
    }

    void write(std::ostream& out)
    {
        out.write((char*)&n, sizeof(n));
        out.write(m_var, strlen(m_var));
        out.write("\n", 1);
    }


    int n;
    char* m_var = nullptr;

    ~Base()
    {
        delete m_var;
    }



};

int main(int, char**)
{
    Base b1(10, "Hello Word!");
    {
        std::ofstream out("testfile.bin");
        b1.write(out);
    }
    std::ifstream in("testfile.bin");
    Base b2(in);

    if (b1 == b2)
    {
        std::cout << "read ok!" << std::endl;
    }
    else
    {
        std::cout << "read failed!" << std::endl;
    }
    return 0;
}
...