【问题标题】:Read last line of file first in C在C中首先读取文件的最后一行
【发布时间】:2015-05-17 10:33:00
【问题描述】:

我目前有一个将新条目附加到当前文件的文件。我想获取最近的 5 个条目。如何在 C 中先读取最后一行?如果可能的话,我想使用 fgets 命令逐行读取。

感谢您的帮助!

编辑: 例如:

原始文件:

The cat is fast.
Dogs are cool.
I like pie.

期望的输出:

I like pie.
Dogs are cool.
The cat is fast.

【问题讨论】:

  • 我之前看到了那个答案,但我希望向后阅读行(但不是内容)我已经用一个例子更新了我的问题
  • 您能指出他们的解决方案为何不适合您吗?
  • 该解决方案向后读取每个字符。例如,“the cat is fast”会读作“tsaf si tac eht”。
  • 再次阅读问题并尝试运行答案中的代码。就像你问的那样,它是按行排列的。 "从文件中向后读入文本,将其缓冲成行 - 即 'abc, def, ghi' 应按行读取 'ghi, def, abc'。"

标签: c file


【解决方案1】:
#include <stdio.h>

#define N 5 //number of recent entry

int main(void){
    long entry[N+1];//+1 for end of file
    int i, index = 0;
    FILE *fp = fopen("entry.txt", "r");
    char line[128];

    for(i=0;i<N+1;++i)
        entry[i] = -1L;//initialize to invalid value

    do{ //path I : store file position
        entry[index++] = ftell(fp);
        if(index == N+1)
            index = 0;
    }while(EOF!=fscanf(fp, "%*[^\n]%*c"));

    if(--index < 0)//one back index
        index += N+1;
    entry[index] = -1L;//for end of file

    for(i = 0; i < N; ++i){//get N entry
        if(--index < 0)
            index += N+1;
        if(entry[index] < 0L)
            break;//when number of entry < N
        fseek(fp, entry[index], SEEK_SET);
        fgets(line, sizeof line, fp);
        fputs(line, stdout);
    }
    fclose(fp);
    return 0;
}

【讨论】:

  • 通过一些解释,这将是一个更好的答案。这会读取整个文件,这对于像日志文件这样的大文件来说效率非常低。它使用静态行缓冲区,它将切断超过 128 字节的行;而不是 fgets,它可以使用 fread 并根据条目索引计算每行的字节数。
  • 你指出的是你最。这只是一个示例。我什至不知道它是否适用于大文件,甚至不知道行的最大预期大小。如果您尝试应用于大文件,也可以从较大的文件大小和行的预期大小中跳过。或者也可以使用之前的处理结果进行操作。
  • 但我认为这也是另一个问题。我不想在没有详细的条件之前做这样的努力,我也不打算这样做。
  • 对代码的限制和假设的那种解释会很好地回答。
【解决方案2】:
while(fgets(buffer,sizeof(buffer),fp); //go on scanning lines

//Now `buffer` holds the last line of `fp`

【讨论】:

  • 感谢您的快速回复!不幸的是,我希望从头到尾阅读每一行(不仅仅是最后一行)。有什么想法吗?
  • 这需要您通读整个文件。对于大文件,这可能会变得非常低效。
  • @user3647894 ,逐个字符读取整个文件并存储换行符的位置。扫描文件后,只需倒退到最近的换行符位置并打印到文件末尾。再次将文件指针倒回到倒数第二个换行符位置并打印所有内容,直到换行符等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多