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}}