0

テキストファイルの最後の行を選択するコードを実装しようとしていますが、現在この例を使用していますが、ファイルが見つからないときにコードが「(null)」を出力しないようにする方法がわかりません。ファイルが見つからない場合、「ファイルは最後の行で開くことができません:そのようなファイルまたはディレクトリはありません」と出力され、次に以下の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;
}
4

3 に答える 3

1

行の後にこれらの 2 行を追加できますlast = lastline("data.txt");。理由NULLは表示されます。関数の結果を表示しているためですlastline()。この関数はNULL、失敗すると戻ります。

if( last != NULL )
    printf( "\"%s\"\n", last );
于 2012-05-11T14:12:41.487 に答える
1

ここから来ています:printf("\"%s\"\n", last);

if (last) {
  printf("\"%s\"\n", last);
  free(last);
}
于 2012-05-11T14:12:44.697 に答える
1

成功したかどうかを確認するには、の戻り値を確認する必要がありfreadます。fread失敗した場合は設定errornoされ、変数sizeは読み取られた文字数になりません。したがって、その後の変数の使用buff

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

予期しない結果が生じる可能性があります。strdup(buff[i])関数から に返される も同様ですmain

于 2012-05-11T14:26:56.363 に答える