Почему моя программа не читает бинарные файлы должным образом? - PullRequest
0 голосов
/ 18 апреля 2020

Когда я читаю двоичный файл, он ничего не читает ... Это чтение:

if (file.is_open())
{
    Challenge* newChallenge;
    while (!file.eof())
    {
        file.read((char*)&newChallenge, sizeof(Challenge));
        if (!challenges.contains(newChallenge))
        {
            challenges.push_back(newChallenge);
        }
    }
    delete newChallenge;
    std::cout << "Successfully loaded " << fileName << std::endl;
    file.close();
}

Это запись:

else if(action == "write"){
    std::ofstream file("Challenges.bin", std::ios::binary);
    if(file.is_open()){
        for (size_t i = 0; i < challenges.length(); i++)
        {
            file.write((char*)&challenges[i], sizeof(Challenge));   
        }
        std::cout << "Successfully written to file!" << std::endl;
    }else {
        std::cout << "Failed to open file!" << std::endl;
    }
    file.close();
}

И это класс испытания:

#ifndef CHALLENGE_H
#define CHALLENGE_H
#include "String.h"

class Challenge
{
private:
    double rating = 0;
    int status = 1, finishes = 0;
    String init;

public:
    Challenge(String _init = "") : init(_init) {}

    void addToStatus() { status++; }
    void addToRating(double rate)
    {
        finishes++;
        rating = ((rating * (finishes - 1)) + rate) / finishes;
    }

    String getChallenge() { return init; }
    int getStatus() { return status; }
    double checkRating() { return rating; }
};

#endif

Примечание. Класс String - это класс, который я создал самостоятельно с использованием char *, а не из std. Мне не разрешено использовать std.

1 Ответ

1 голос
/ 18 апреля 2020
Challenge* newChallenge;
while (!file.eof())
{
    file.read((char*)&newChallenge, sizeof(Challenge));
...

Этот код объявляет указатель на экземпляр класса, который не инициализирован, чтобы указывать на что-либо, а затем, очевидно, хотел прочитать по нему несколько байтов из файла на диске.

Это очень и очень неправильно в как минимум три уровня:

  1. вы не выделяли никакой памяти
  2. объекты не являются байтовыми блоками, и для их создания вам нужно вызвать конструкторы
  3. чтение предназначено для указатель, а не указанная память (в вызове fread больше &)
...