Консультация № 30342
27.11.2005, 23:33
0.00 руб.
0 2 1
Здравствуйте.
Скажите пожалуйста как считывать из файла и записывать файл по битово или по байтово, существуют ли в языке С++ какие либо операторы или функции, позволяющие записать файл побитово?
Допустим у меня есть файл, но в нём встречаются только русские символы и вместо того чтобы тратить по 8 бит на символ, я могу потратить 6 бит на символ.
Я долго мучался и написал несколько функций которые превращают 4 символа в 3.
Может можно как-то сделать проще? Т.е. обойти преобразования в битовые массивы, перевод байта в набор бит, в соответствии со словарём, обратное преобразование из битовых массивов в байт... Другими словами записать и считать из файла бит, а не байт.
Если же нельзя сделать проще, пожалуста приведите несколько примеров как записать/считать в/из файла n количество байт.

Обсуждение

Неизвестный
28.11.2005, 00:18
общий
это ответ
Здравствуйте, Константин Константинович!
Ну, если я делал учет русских букв (а также других нестандартных символов), я бы использовал по 16 бит на символ, т.е. юникод, что всегда стараюсь и делать, все же у нас нет ограничения на 64 кб бинарника и винты уже далеко не двухсотметровые :)
А если уж сильно хочется, то надо писать свою обвертку на запись/чтение, наподобия MFC-шного CArchive. Тогда вычисляй, сколько на самом деле занимает строка/число и пиши себе хоть 1 байт, хоть три для любого типа. Главное читать потом правильно, по тем же правилам.
Фукнций для записи данных менее одного байта не знаю, да и вряд ли такие есть, хотя бы потому, что в языке минимальный размер типа - 1 байт. Как ты предпологаешь передать данные в функцию? Можно конечно, но такой геморрой того не стоит.
А насчет чтения/записи вообще, см. приложение (пишу код по памяти, так если чего...)

Приложение:
void Save (TCHAR * path, TCHAR * buff) {HANDLE hFile = CreateFile (path, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, NULL, NULL);if (hFile == INVALID_HANDLE_VALUE) { // error return;}DWORD written = 0;bool res = WriteFile (hFile, (void *)buff, lstrlen (buff), &written, NULL);CloseHandle (hFile);if (!res) { // error}}void Load (TCHAR * path, TCHAR * buff, int bytesToRead = 0) {HANDLE hFile = CreateFile (path, GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL);if (hFile == INVALID_HANDLE_VALUE) { // error return;}DWORD size = GetFileSize (hFile, NULL);bytesToRead = (bytesToRead == 0 || bytesToRead > size ? size : bytesToRead);DWORD read = 0;bool res = ReadFile (hFile, (void *)buff, bytesToRead, &read, NULL);CloseHandle (hFile);if (!res || read != bytesToRead) { // error}}
Неизвестный
28.11.2005, 01:11
общий
Кстати я не понял, как же минимальный размер типа - 1 байт, если тип bool, он разве не 1 бит занимает?Есть ещё решение на обычном си, не знаю что быстрее, но было бы хорошо его тоже узнать...Ещё может есть самый быстрый способ пробежаться в цыкле по всему файлу проверяя каждый байт?
Форма ответа