Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > [VC++] Запись текста в бинарый/двоичный файл.


Автор: MuForum 8.4.2010, 14:11
Доброго времени суток.
Работаю на "Microsoft Visual Studio 2010";
Язык программирования: "C++";
Операционная система: Windows NT+;

# Задача: Реализовать самый быстрый способ записи логов на жесткий диск.
- На сколько я понимаю, то запись символьных данных в двоичный/бинарный файл будет гораздо быстрее чем в символьный.
- Я решил реализовать запись данных в бинарном виде, а уже для просмотра написать отдельно программу для переконвертирования данных.
- То есть, необходимо записать массив символов в двоичном виде в двоичный файл.


# Запись данных в текстовой файл:
Код

void TLog::WriteDataInFile(char * szFilePath, char * szBuf, int iSize)
{
    m_fHandle    = fopen(szFilePath, "a");
    // ----
    if ( m_fHandle != NULL )
    {
        //fprintf(m_fHandle, szBuf);
        fwrite(szBuf, iSize, 1, m_fHandle);
        // ----
        fclose(m_fHandle);
    }
}



# Запись данных в бинаный файл: (Но это не правильный вариант)
Код

void TLog::WriteDataInFile(char * szFilePath, char * szBuf, int iSize)
{
    m_fHandle    = fopen(szFilePath, "ab");
    // ----
    if ( m_fHandle != NULL )
    {
        fwrite(szBuf, iSize, 1, m_fHandle);
        // ----
        fclose(m_fHandle);
    }
}


Но проблема в том, размер файла уменьшается лишь на маленький объём
+ Файл можно открыть и просмотреть через обычный блокнот, а это уже противоречит сути бинарных файлов.


P.S. -> Прошу помочь реализовать задачу.

Автор: borisbn 8.4.2010, 15:33
1. Буква b во втором параметре fopen'а указывает, нужно ли при записи преобразовывать символ \r в \r\n
2. char * szBuf уже содержит символы, которые записываются в файл. Если хочешь записать в файл переменную типа int, нужно писать
Код

int x = 100;
fwrite( &x, 1, sizeof( x ), m_fHandle );

3. зачем переменная m_fHandle заведена в классе, если она используется только внутри функции WriteDataInFile. объяви её там локально. хотя это непринципиально.

Автор: Alca 8.4.2010, 15:41
Цитата

 Реализовать самый быстрый способ записи логов на жесткий диск.

Попробуй вместо CRT-шных fwrite, fread использовать WinAPI-шные ::WriteFile, ::ReadFile функции (хотя первые юзают вторые).

Добавлено @ 15:42
Можно еще поиграться с размером буфера.

Добавлено через 3 минуты и 39 секунд
+ Асинхронные запись/чтение

Автор: mrbrooks 8.4.2010, 15:46
Цитата(MuForum @  8.4.2010,  15:11 Найти цитируемый пост)
Файл можно открыть и просмотреть через обычный блокнот, а это уже противоречит сути бинарных файлов.

на каком основании сделано данное замечание? через блокнот можно открыть многое - не многое вот только можно понять.

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

Цитата(MuForum @  8.4.2010,  15:11 Найти цитируемый пост)
Язык программирования: "C++";

почему не используете файловый ввод/вывод в стиле С++?

Добавлено через 2 минуты и 37 секунд
http://cplusplus.com/reference/iostream/fstream/

Автор: Peter 9.4.2010, 11:21
Можно позаимствовать опыт у уже созданных библиотек для ведения логов. http://logging.apache.org/log4cxx/index.html, например. Уж там на этой оптимизации собаку съели.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)