【发布时间】:2013-01-27 20:39:30
【问题描述】:
在 C 中反向读取文件的最佳方法是什么?我知道一开始您可能会认为这没有任何用处,但大多数日志等都会在文件末尾附加最新数据。我想从文件中向后读取文本,将其缓冲成行-即
abc
定义
吉
应该按行读取ghi、def、abc。
到目前为止我已经尝试过:
#include <stdio.h>
#include <stdlib.h>
void read_file(FILE *fileptr)
{
char currentchar = '\0';
int size = 0;
while( currentchar != '\n' )
{
currentchar = fgetc(fileptr); printf("%c\n", currentchar);
fseek(fileptr, -2, SEEK_CUR);
if( currentchar == '\n') { fseek(fileptr, -2, SEEK_CUR); break; }
else size++;
}
char buffer[size]; fread(buffer, 1, size, fileptr);
printf("Length: %d chars\n", size);
printf("Buffer: %s\n", buffer);
}
int main(int argc, char *argv[])
{
if( argc < 2) { printf("Usage: backwards [filename]\n"); return 1; }
FILE *fileptr = fopen(argv[1], "rb");
if( fileptr == NULL ) { perror("Error:"); return 1; }
fseek(fileptr, -1, SEEK_END); /* Seek to END of the file just before EOF */
read_file(fileptr);
return 0;
}
试图简单地读取一行并缓冲它。对不起,我的代码很糟糕,我变得非常困惑。我知道您通常会为整个文件分配内存然后读取数据,但对于不断变化的大文件,我认为直接读取会更好(特别是如果我想在文件中搜索文本)。
提前致谢
* 抱歉忘了提到这将在 Linux 上使用,所以换行符只是没有 CR 的 NL。 *
【问题讨论】:
-
您可以memory map the file,并使用指针算法“读取”文件。可能比必须不断地用文件指针来回跳转更简单。
-
来自 C 标准:
A binary stream need not meaningfully support fseek calls with a whence value of SEEK_END. -
也许您可以登录数据库而不是普通文件?
-
不是一次读取整个文件,您可以从末尾开始大块读取它。
-
@VaughnCato 我相信操作人员正在尝试弄清楚如何做到这一点。
标签: c text stream standard-library