2

次のコードを使用して、ファイルの最後の文字を取得したい

 FILE * f = fopen ( f_text, "r" );
 if (f )
 {
    if (fseek( f, -1, SEEK_END ) != 0 ) fclose (f);
    char last[1]; 
    fgets(last, 1, f );
    ...

ただし、最後に変数に格納されるのは「」のみです。バグはどこにありますか?

Unicodeファイルに問題はありますか?ご協力いただきありがとうございます。

4

3 に答える 3

4

問題はfgets、文字列を形成することです。使用するバイトを1バイトだけ指定したため、空の文字列のみを返すことができます。これは、を格納するためにそのバイトが必要になるため'\0'です。

James Kanzeが私に指摘したようにfseek、ファイルをバイナリモードで開いた場合にのみ、移植可能な方法で使用できます。ファイルは現在バイナリモードになっているため、を使用することは不適切fgetsです。したがって、fread代わりに使用します。

FILE *f = fopen(f_text, "rb");
if (f == 0) throw 0;
try {
    if (fseek(f, -1, SEEK_END) != 0) throw 0;
    char last[1];
    if (fread(last, 1, 1, f) != 1) throw 0;
    //...
}
catch (...) {
    fclose(f);
    throw;
}
fclose(f);
于 2012-07-05T17:25:12.533 に答える
1

fgetc代わりに使用してみてくださいfgets

于 2012-07-05T17:30:16.430 に答える
0

最後の文字を印刷するために、コードにいくつかの変更を加えました。サンプルとしてtest.cを次に示します。

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

int main(int argc, char *argv[])
{

    FILE * f;
    char * f_text = "temp.txt";

    f = fopen ( f_text, "r" );
    if (f )
    {

        if (fseek( f, -2, SEEK_END ) == 0 ) 
        {
            char last[2] = {0}; 
            printf("Got here.\n");
            last[0] = fgetc( f );
            printf("%s\n", last);
        }
    }

    return 0;
}

これがコマンドラインに表示されるtemp.txtです。

octopusgrabbus@steamboy:~/scratch$ cat temp.txt
This is a test.
octopusgrabbus@steamboy:~/scratch$ 

私はあなたのfseekを最後から2つを探すように変更したので、テストは期間を印刷します。別の答えが示すように、私はfgetsの代わりにfgetcを使用しました。これは、完全な文字列ではなく、個々の文字を探していたためです。

また、lastをlast [2]に変更し、ゼロに初期化したので、デモの目的で最後の文字をゼロで終了する文字列として扱うことができました。

于 2012-07-06T15:33:21.507 に答える