alexanderBaranov / OOP

OOP
0 stars 0 forks source link

Замечания по лабораторной работе 2 задание 4 (RLE) #3

Open alexey-malov opened 9 years ago

alexey-malov commented 9 years ago
static size_t const kFileSize = 1024 * 1024 * 1024 * 2;

Компилятор сообщает о целочисленном переполнении. На 32-битной платформе int вмещает от -2GiB до 2GiB-1. 2GB в int не влезет. Чтобы результат вычислялся как unsigned int добавь к перемножаемым константам суффикс u

alexey-malov commented 9 years ago
void Pack(const TCHAR *inFile , const TCHAR *outFile)
{
    ifstream inputFile(inFile, ifstream::binary);
    if (!inputFile)
    {
        throw exception("Input file not found.");
    }

    ofstream outputFile(outFile, ofstream::binary);
    if (!outputFile)
    {
        throw exception("Output file not found.");
    }

    packedData data = {};
    while (!inputFile.eof())
    {
        char ch;
        inputFile.read(&ch, sizeof(char));
        if (inputFile.eof() || ((data.counter != 0 ) && (data.symbol != ch)) || (data.counter == 255))
        {
            outputFile.write(reinterpret_cast<char *>(&data), sizeof(packedData));
            data.counter = 0;
        }

        data.symbol = ch;
        data.counter++;
    }
}

Если уж используешь исключения, то используй метод exceptions файлового потока, чтобы задать маску для выбрасывания исключений в случае установки фейловых битов. Ну и у выходного потока лучше явно вызвать close, т.к. он может буферизировать данные и при закрытии скидывать их на диск. Если при этом произойдет ошибка, то так будет выброшено исключение. Если же close() будет вызван деструктором, то там он будет обернут в try/catch и потенциальная ошибка будет проглочена Для unpack аналогично

alexey-malov commented 9 years ago

k=0,8