这个“(null)”来自哪里

时间:2012-05-11 14:09:13

标签: c file-io

我正在尝试实现一些代码来挑选文本文件的最后一行,并且我目前正在使用这个示例,但我无法想象如何防止代码在无法找到时打印出“(null)”文件,在它无法找到文件的那一刻,它将打印出“文件无法在最后一行打开:没有这样的文件或目录”然后它将打印下面的null事物,对于这个特定的应用程序我宁愿它只是打印出“文件无法打开”部分,但不打印出空白部分,如果有人能指出我正确的方向,我会非常感激,谢谢!

#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(0);
    }
    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;
}

3 个答案:

答案 0 :(得分:1)

您可以在第last = lastline("data.txt");行之后添加这两行。打印NULL的原因是因为您正在打印函数lastline()的结果。该函数将在失败时返回NULL

if( last != NULL )
    printf( "\"%s\"\n", last );

答案 1 :(得分:1)

它来自这里:printf("\"%s\"\n", last);

if (last) {
  printf("\"%s\"\n", last);
  free(last);
}

答案 2 :(得分:1)

您应该检查fread的返回值以检查它是否成功。如果fread失败,则会设置errorno,而您的变量size将不会读取字符数。因此,您随后使用变量buff

buff[size] = '\0';
i=size-1;
if(buff[i]=='\n'){
    buff[i] = '\0';
}

会产生意想不到的结果。从strdup(buff[i])函数返回的main也是如此。