C++ Вопрос Система логирования

Всем Рептилойдам - Рен ТВ
Пользователь
Статус
Оффлайн
Регистрация
1 Фев 2020
Сообщения
541
Реакции[?]
92
Поинты[?]
0
Добрый вечер.

Использую:

void log(std::string info) {
std::ofstream myfile;
myfile.open("logs.txt");
myfile << info << std::endl;
myfile.close();
}

Почему при создании нового лога удаляется старый?
Возможно проблема в повторном использовании "open"?
}
Вопрос:
 
Пользователь
Статус
Оффлайн
Регистрация
17 Июл 2021
Сообщения
462
Реакции[?]
118
Поинты[?]
10K
Замечательный вопрос, ответа ты не получишь.

В чем смысл хайдов на вопросы?
 
Пользователь
Статус
Оффлайн
Регистрация
17 Июл 2021
Сообщения
462
Реакции[?]
118
Поинты[?]
10K
Всем Рептилойдам - Рен ТВ
Пользователь
Статус
Оффлайн
Регистрация
1 Фев 2020
Сообщения
541
Реакции[?]
92
Поинты[?]
0
C++:
std::ofstream myfile;
myfile.close(); // Закрывает файл (удали это и не будет перезаписываться)
Пробовал. И да, файл не удаляется. При создании лога - старый заменяется на новый.
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
void  add_log(const char* fmt ...)
{
    char buf[1024] = { 0 };
    va_list va_alist;
    ofstream ofile;

    va_start(va_alist, fmt);
    vsnprintf_s(buf, sizeof(buf), fmt, va_alist);
    va_end(va_alist);
    ofile.open("Log.txt", ios::app);
    if (ofile.fail()) return;
    ofile << buf << endl;
    ofile.close();
}
 
всем прив верите ли вы в призраков ???
Забаненный
Статус
Оффлайн
Регистрация
17 Авг 2018
Сообщения
861
Реакции[?]
338
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Добрый вечер.

Использую:

void log(std::string info) {
std::ofstream myfile;
myfile.open("logs.txt");
myfile << info << std::endl;
myfile.close();
}

Почему при создании нового лога удаляется старый?
Возможно проблема в повторном использовании "open"?
}
Вопрос:
Дело в том, что по умолчанию метод open как раз таки полностью перезапишет целевой файл. Для реализации добавления в конец необходимо добавить флаг ios::app в качестве второго аргумента:
C++:
void log(std::string info) {
    std::ofstream myfile;
    myfile.open("logs.txt", ios::app);
    myfile << info << std::endl;
    myfile.close();
}
Если интересно, можете изучить основные флаги, которые можно совмещать с помощью побитового ИЛИ (|):
  • app — открывает файл в режиме добавления;
  • ate — переходит в конец файла перед чтением/записью;
  • binary — открывает файл в бинарном режиме (вместо текстового режима);
  • in — открывает файл в режиме чтения (по умолчанию для ifstream);
  • out — открывает файл в режиме записи (по умолчанию для ofstream);
  • trunc — удаляет файл, если он уже существует.
 
всем прив верите ли вы в призраков ???
Забаненный
Статус
Оффлайн
Регистрация
17 Авг 2018
Сообщения
861
Реакции[?]
338
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Дело в том, что по умолчанию метод open как раз таки полностью перезапишет целевой файл. Для реализации добавления в конец необходимо добавить флаг ios::app в качестве второго аргумента:
C++:
void log(std::string info) {
    std::ofstream myfile;
    myfile.open("logs.txt", ios::app);
    myfile << info << std::endl;
    myfile.close();
}
Если интересно, можете изучить основные флаги, которые можно совмещать с помощью побитового ИЛИ (|):
  • app — открывает файл в режиме добавления;
  • ate — переходит в конец файла перед чтением/записью;
  • binary — открывает файл в бинарном режиме (вместо текстового режима);
  • in — открывает файл в режиме чтения (по умолчанию для ifstream);
  • out — открывает файл в режиме записи (по умолчанию для ofstream);
  • trunc — удаляет файл, если он уже существует.
а, вот я дебил...
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Почему при создании нового лога удаляется старый?
Тут проблема не только в параметрах, вот так открывать файл каждый раз когда тебе нужно дописать строчку будет очень медленно.
В норме нужно открывать файл при запуске (на винде в расшаренном режиме _SH_DENYNO) например через fopen(), и записывать через fwrite(), а чтобы содержимое сразу добавлялось в файл без кеширований (если например есть шанс краша) то можно использовать fflush(), это будет все равно быстрее открытия файла каждый раз.
 
Сверху Снизу