Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VC++] Запись текста в бинарый/двоичный файл. Запись логов в файл. 
:(
    Опции темы
MuForum
Дата 8.4.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Доброго времени суток.
Работаю на "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. -> Прошу помочь реализовать задачу.

Это сообщение отредактировал(а) MuForum - 8.4.2010, 14:13


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
borisbn
Дата 8.4.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



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

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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alca
Дата 8.4.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

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

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

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

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

Это сообщение отредактировал(а) Alca - 8.4.2010, 15:44


--------------------
PM WWW ICQ Skype Jabber   Вверх
mrbrooks
Дата 8.4.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



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

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

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

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

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

Добавлено через 2 минуты и 37 секунд
для ознакомления
PM MAIL   Вверх
Peter
Дата 9.4.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Можно позаимствовать опыт у уже созданных библиотек для ведения логов. log4cxx, например. Уж там на этой оптимизации собаку съели.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.