大きなファイルがあり、一定のサイズになったら、前半を完全に削除して後半をシフトダウンし、実質的に半分のサイズにします。これが私が考えていることです:
FILE *fp, *start;
int ch, block_length, filesize;
char c;
//open the file and initialize pointers
fp = fopen(FILEPATH, "rb+");
start = fp;
rewind(start);
//Check the size of the file
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
if(filesize >= LOG_MAX_FILE_SIZE)
{
//Go to middle of file
fseek(fp, (-1) * LOG_MAX_FILE_SIZE/2, SEEK_END);
//Go forwards until you get a new line character to avoid cutting a line in half
for(;;)
{
//Read char
fread(&ch, 1, 1, fp);
//Advance pointer
fseek(fp, 1, SEEK_CUR);
if( (char)ch == '\n' || ch == EOF)
break;
}
//fp is now after newline char roughly in middle of file
//Loop over bytes and put them at start of file until EOF
for(;;)
{
//Read char
fread(&ch, 1, 1, fp);
//Advance pointer
fseek(fp, 1, SEEK_CUR);
if(ch != EOF)
{
c = (char)ch;
fwrite(&c,1,1,start);
fflush(start);
//Advance start
fseek(start, 1, SEEK_CUR);
}
else
break;
}
//Calculate length of this new file
block_length = ftell(start);
//Go back to start
rewind(start);
//Truncate file to block length
ftruncate(fileno(start), block_length);
}
しかし、これは非常に奇妙なことをしているようです(ファイルに「f」を埋め込んだり、行とその中のいくつかの文字を混同したりするなど)。このコードで私が間違っている可能性があることについて誰かが何か考えを持っていますか?よろしくお願いします!