я думаю, что Вам понравится следующее:
голосование это, если Вам нравится он
Если вы реализуете и писатель, и читатель, вы можете сделать что-то вроде этого:
struct logentry {
timestamp ts;
char msg [4000];
};
class logger {
private:
int write_recordnum; // next record number to write
int max_recordnum; // controls maximum size of file
FILE *logfile;
public:
logger (const char *filename, int max_records)
{
max_recordnum = max_records;
logfile = fopen (filename, "a+");
}
void write_next_entry (const char *msg, ...)
{
struct logentry ent;
// format message into entry
va_list ap;
va_start (ap, msg);
vsnprintf (ent.msg, sizeof(ent.msg), msg, ap);
va_end (ap);
ent.ts = gettimestamp();
// position logfile
if (write_recordnum > max_recordnum)
write_recordnum = 0;
fseek (logfile, write_recordnum * sizeof (ent), 0);
fwrite (&ent, 1, sizeof(ent), logfile);
}
bool read_entry (int recnum, char *msg)
{
struct logentry ent;
if (recnum >= max_recordnum)
return false;
fseek (logfile, recnum * sizeof (ent), 0);
fread (&ent, 1, sizeof(ent), logfile);
strcpy (msg, ent.msg);
return true;
}
};
Идея состоит в управлять кольцевым буфером с помощью явных номеров записей фиксированного размера. Необходима логика для управления тем, существует ли запись N, и для проверки ошибок.
Why not do rolling logfiles? Does it have to be precisely 10MB? If 10MB is your quota, a common practice would be to write to blah.log, and when it hits, say 1MB, rename file to blah.log.1 and start writing to blah.log. Much simpler, and a very common practice. In fact, in Linux, if you use syslog, it's free.
Если вы используете Log4 [j / net], есть опции для скользящего журнала. См. RollingFileAppender . Кроме того, при указании атрибутов файла журнала есть возможность установить максимальный размер файла журнала. (Параметр: MaxFileSize)