2011-03-14 127 views
0

我正在创建一个应用程序,它必须从文本文件中获取一些数据。问题是,我需要的数据是在文本文件的最后一行。有没有办法以某种方式阅读最后一行?我只需要最后一行内容。有人能帮助我吗?如何从文件中读取最后一行?

谢谢

+4

如果它是一个大的文件,那么你的两个电流的答案是相当绝望。寻找到最后,然后向后读取(进入适当大小的缓冲区),直到找到足够的行结束点来识别所需的行。 – 2011-03-14 20:16:48

+0

@David:或者使用'MapViewOfFile'让操作系统担心合适的缓冲。根据需要处理结尾的空行,调用'strrchr'两次,并获取两者之间的数据。 – 2011-03-14 21:09:51

+0

@Ben好吧,一旦我们已经超出了整个文件的阅读范围,你的建议就像是微观优化! ;-) – 2011-03-14 21:25:17

回答

1

阅读整个文件,保持两行,然后丢弃最后一个,例如:

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

int secondtolast(char *dst, size_t maxlen, FILE *h) { 
    char *line[2]; 
    int i = 0; 

    line[0] = malloc(maxlen); 
    if (!line[0]) return 1; 
    *line[0] = 0; 
    line[1] = malloc(maxlen); 
    if (!line[1]) { 
     free(line[0]); /* return memory to the OS */ 
     return 1; 
    } 
    *line[1] = 0; 

    while (fgets(line[i], maxlen, h)) i = !i; 
    strcpy(dst, line[i]); 

    free(line[0]); 
    free(line[1]); 

    return 0; 
} 

int main(void) { 
    char l2[8192]; 
    if (secondtolast(l2, sizeof l2, stdin)) { 
    fprintf(stderr, "no memory"); 
    } 
    printf("second to last line: %s", l2); 
    return 0; 
} 
1

这是一个快速和脏的代码。它读取所有行以获取所有行的数量,将文件回卷到开头,然后再次读取行,直到最后一行为止。最后读取最后一行,并存储在变量lastLineButOne中。

#include <stdio.h> 
#define BUF 255 

int getNoOfLines(FILE *f) { 
    int ctr=0; 
    char temp[BUF]; 
    while(fgets(temp,BUF,f) != NULL) 
     ctr++; 
    return ctr; 
} 

int main() { 
    int i; 
    FILE *f=fopen("apps.txt","r"); 
    char lastLineButOne[BUF]; 
    char temp[BUF]; 
    int noOfLines=getNoOfLines(f); 
    rewind(f); 
    for(i = 0; i < noOfLines-2; i++) { 
     fgets(temp,BUF,f); 
    } 
    fgets(lastLineButOne,BUF,f); 
    printf("%s",lastLineButOne); 
    fclose(f); 
    return 0; 
} 
相关问题