0

私はこれについて広範囲にグーグルで検索しましたが、現在4時間立ち往生しています。誰かが私を助けてくれることを願っています.

約 2.7 MB のバイナリ ファイルを読み取る簡単なプログラムがあります。プログラムは、tcc コンパイラを使用して Windows でコンパイルされます。私はさまざまな高級言語 (Pascal、Modula2、Matlab、PHP、Basic) の経験がありますが、C は初めてで、これはメモリ割り当てと変数の上書きに関係していると思われます。

void main ()
{
    long  int start_loc;
    long  int actual_loc;
    int seek_result;
    char file_to_process[]="d:/tmp/pfc/test.out";
    char read_int;
    int spaces;
    int read_result;
    FILE *data_file;
    //fpos_t position;

    data_file=fopen(file_to_process,"r");

    if (data_file == NULL) {
        printf("Error");
    }

    start_loc =  1002;

    printf("\n size of start_loc : %d",sizeof(start_loc));

    actual_loc = ftell(data_file);
    printf("\nBEFORE location %d \n",actual_loc);         

    seek_result = fseek(data_file, start_loc, SEEK_SET); //move to start of search location in the file

    actual_loc = ftell(data_file);
    printf("\n AFTER seek location %d \n",actual_loc);        

    fread(&read_int, 1, 1, data_file);

    actual_loc = ftell(data_file);
    printf("\n AFTER read location %d \n",actual_loc);        
    printf("\n read result %x" ,*&read_int);

    fread(&read_int, 1, 1, data_file);
    actual_loc = ftell(data_file);
    printf("\n AFTER read location %d \n",actual_loc);        
    printf("\n read result %x" ,*&read_int);


    fclose(data_file);
    return; 
}

上記の例では、ファイルの 1002 番目の場所から読み取ります - これは正常に動作します - 結果は次のとおりです。

size of start_loc : 4
BEFORE location 0 

AFTER seek location 1002 

AFTER read location 1003 

read result 0
AFTER read location 1004 
read result 3

すべてが期待どおりに機能します。ファイル ポインタは、読み取られたバイトごとに 1 文字ずつ進みます。

問題は、開始場所の値などで発生します。

start_loc = 16000

この場合、コマンド egie read 1 バイトの後に、ファイル ポインタが一見ランダムな方法でジャンプし、ファイル ポインタが 19586 に移動します。

size of start_loc : 4
BEFORE location 0 

AFTER seek location 16000 

AFTER read location 19585 

read result 47
AFTER read location 19586 

read result 0

ここまで読んでくれてありがとう!

4

1 に答える 1

1

ファイルはテキスト モード (r) で開かれており、テキスト モードでは、c++ リファレンスに ftell 関数について記載されています。テキスト ストリームの場合、数値は意味をなさない可能性がありますが、後で fseek ( ungetc を使用して戻された文字がまだ読み取られていない場合、動作は未定義です)。

したがって、得られるものはドキュメントと一致しているようであり、心配する必要はありません。

バイナリ ファイルとして開きたい場合は、fopen モードに「b」を追加する必要があることに注意してください。

于 2014-02-21T21:45:56.287 に答える