如何使用C选择文本文件的最后一行 我试图找出一个方法来选择最后一行的文本文件使用C不是C++或C,只是C和我有一个困难的时间找到一个办法来做这件事,如果有人能帮助我这个问题,我将非常感谢,谢谢!顺便说一句,作为我正在尝试做的一个很好的例子,这与tail-n1在bash中所做的类似,没有直接的方法,但我首选的方法是: 转到文件的末尾 读取最后X字节 如果它们包含“\n”-您得到了您的行-从该偏移量读取到文件末尾 读取它们前面的X字节 返回到3,直到找到匹配项 如果到达文件的开头,则整个文件是最后一行

如何使用C选择文本文件的最后一行 我试图找出一个方法来选择最后一行的文本文件使用C不是C++或C,只是C和我有一个困难的时间找到一个办法来做这件事,如果有人能帮助我这个问题,我将非常感谢,谢谢!顺便说一句,作为我正在尝试做的一个很好的例子,这与tail-n1在bash中所做的类似,没有直接的方法,但我首选的方法是: 转到文件的末尾 读取最后X字节 如果它们包含“\n”-您得到了您的行-从该偏移量读取到文件末尾 读取它们前面的X字节 返回到3,直到找到匹配项 如果到达文件的开头,则整个文件是最后一行,c,file-io,C,File Io,如果您使用的是*nix操作系统,则可以使用命令“last”。有关详细信息,请参阅“最后一个”手册页。 如果您想将功能集成到另一个程序中,可以使用“system”调用执行“last”并获得结果。一种简单而低效的方法是将每一行读入缓冲区。 当最后一次读取给出EOF时,缓冲区中就有了最后一行 Binyamin Sharet的建议效率更高,但实施起来更难 #include <stdio.h> #include <stdlib.h> #include <string.h>

如果您使用的是*nix操作系统,则可以使用命令“last”。有关详细信息,请参阅“最后一个”手册页。
如果您想将功能集成到另一个程序中,可以使用“system”调用执行“last”并获得结果。

一种简单而低效的方法是将每一行读入缓冲区。 当最后一次读取给出EOF时,缓冲区中就有了最后一行

Binyamin Sharet的建议效率更高,但实施起来更难

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef max
#define max(a, b) ((a)>(b))? (a) : (b)
#endif

long GetFileSize(FILE *fp){
    long fsize = 0;

    fseek(fp,0,SEEK_END);
    fsize = ftell(fp); 
    fseek(fp,0,SEEK_SET);//reset stream position!!

    return fsize;
}
char *lastline(char *filepath){
    FILE *fp;
    char buff[4096+1];
    int size,i;
    long fsize;
    if(NULL==(fp=fopen(filepath, "r"))){
        perror("file cannot open at lastline");
        return NULL;
    }
    fsize= -1L*GetFileSize(fp);
    if(size=fseek(fp, max(fsize, -4096L), SEEK_END)){
        perror("cannot seek");
        exit(1);
    }
    size=fread(buff, sizeof(char), 4096, fp);
    fclose(fp);
    buff[size] = '\0';
    i=size-1;
    if(buff[i]=='\n'){
        buff[i] = '\0';
    }
    while(i >=0 && buff[i] != '\n')
        --i;
    ++i;
    return strdup(&buff[i]);
}

int main(void){
    char *last;

    last = lastline("data.txt");
    printf("\"%s\"\n", last);
    free(last);
    return 0;
}
我正在使用Linux。
CMIIW

简单方法:先查看文件的结尾,然后向后读取,直到找到a\n。您能告诉我们您遇到问题的代码吗?如果行数不超过n,您可以将其简化。只需读取最后n个字节并查找其中的最后\n个字节。谢谢帮助!我有点困惑我应该如何去做,使它更容易理解,虽然我在自学C,并认为我会将一些日志搜索bash脚本重写为C作为练习很高兴听到!快乐编码:假设一行短4096字节。这实际上是提供的最快的示例,需要做一些挖掘来了解这一行是如何工作的:是的,通常使用tail来实现这一点,但我对完全使用C来实现这一点很感兴趣,不过感谢您的输入!如果最后一行没有换行终止,会发生什么情况?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(int argc, char *argv[])
{
    FILE *fd; // File pointer
    char filename[] = "./Makefile"; // file to read
    char buff[1024];

    if ((fd = fopen(filename, "r")) != NULL) // open file
    {
        fseek(fd, 0, SEEK_SET); // make sure start from 0

        while(!feof(fd))
        {
            memset(buff, 0x00, 1024); // clean buffer
            fscanf(fd, "%[^\n]\n", buff); // read file *prefer using fscanf
        }
        printf("Last Line :: %s\n", buff);
    }
}