3

私はC(c ++やc#ではなくCだけ)を使用してテキストファイルの最後の行を選択する方法を見つけようとしていますが、誰かがこの問題で私を助けることができれば、これを行う方法を見つけるのに苦労していますとてもありがたいです、ありがとう!(ところで、私がやろうとしていることの良い例として、これはtail -n 1がbashでやっていることと似ています)

4

5 に答える 5

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

Linuxを使用しています。CMIIW

于 2012-05-07T10:09:15.140 に答える
5

直接的な方法はありませんが、私の好みの方法は次のとおりです。

  1. ファイルの最後に移動します
  2. 最後のXバイトを読み取る
  3. それらに「\n」が含まれている場合-あなたはあなたの行を取得しました-そのオフセットからファイルの終わりまで読み取ります
  4. それらの前にXバイトを読み取る
  5. 一致するものが見つかるまで3に戻ります
  6. ファイルの先頭に達した場合-ファイル全体が最後の行になります
于 2012-05-07T04:05:59.600 に答える
1

例えば

#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;
}
于 2012-05-07T09:35:01.330 に答える
0

* nixオペレーティングシステムを使用している場合は、コマンド「last」を使用できます。詳細については、「最後の」マニュアルページを参照してください。機能を別のプログラム内に統合する場合は、「system」呼び出しを使用して「last」を実行し、その結果を取得できます。

于 2012-05-07T05:13:29.160 に答える
0

これを行う簡単で非効率的な方法は、各行をバッファに読み込むことです。
最後の読み取りでが得られるとEOF、バッファーに最後の行があります。

Binyamin Sharetの提案はより効率的ですが、実装するのが少し難しいです。

于 2012-05-07T06:20:27.677 に答える