我正在为Web应用程序编写一个日志文件查看器,为此我想通过日志文件的行分页.文件中的项目是基于行的,底部是最新项目.
所以我需要一种tail()方法,可以n从底部读取行并支持偏移量.我想出的是这样的:
def tail(f, n, offset=0):
"""Reads a n lines from f with an offset of offset lines."""
avg_line_length = 74
to_read = n + offset
while 1:
try:
f.seek(-(avg_line_length * to_read), 2)
except IOError:
# woops. apparently file is smaller than what we want
# to step back, go to the beginning instead
f.seek(0)
pos = f.tell()
lines = f.read().splitlines()
if len(lines) >= to_read or pos == 0:
return lines[-to_read:offset and -offset or None]
avg_line_length …Run Code Online (Sandbox Code Playgroud) 我需要从下到上读取文件中列出的数字.我怎么能用C做到这一点?
该文件如下:
4.32
5.32
1.234
0.123
9.3
6.56
8.77
Run Code Online (Sandbox Code Playgroud)
例如,我想阅读最后三个数字.他们必须是float类型.
8.77
6.56
9.3
Run Code Online (Sandbox Code Playgroud)
PS.:实际上我需要一个使用fseek等播放文件指针位置的解决方案.
这是一个面试问题和对效率的担忧.当存在非常大的文件(以GB为单位)时,就像日志文件一样.我们怎样才能从文件末尾找到第10个出现的'error'或'java'等单词.我只能想到扫描整个文件,然后以相反的顺序找出事件.但我不认为这是正确的做法!(最好用C或Java编码)
我还想知道另一件事.当面试官特别提到它是一个非常大的文件时,我们开始编写代码时应该考虑哪些因素(除了记住扫描是非常昂贵的事情)
如何从下往上逐行遍历文件?例如,这是我从上到下遍历它的代码:
void *readFileTB(char *str1)
{
int size = 1024;
char *buffer = malloc(size);
FILE *fp;
fp = fopen("testfile.txt", "r");
while(fgets(buffer, 1024, fp)) //get a line from a file
{
printf(buffer);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果文件包含:
line1onetest
line2twotest
line3threetest
Run Code Online (Sandbox Code Playgroud)
如果执行此功能将打印以下内容:
line1onetest
line2twotest
line3threetest
Run Code Online (Sandbox Code Playgroud)
我怎样才能编写一个能够完成上述操作但功能相反的函数,以便输出以下内容?
line3threetest
line2twotest
line1onetest
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?