Open alexey-malov opened 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 аналогично
k=0,8
Компилятор сообщает о целочисленном переполнении. На 32-битной платформе int вмещает от -2GiB до 2GiB-1. 2GB в int не влезет. Чтобы результат вычислялся как unsigned int добавь к перемножаемым константам суффикс u