0

FILEポインタの操作とf関数の仕組みについて疑問に思っていfputcます。

まず、ファイルを開くとき (書き込みや読み取りなど、まだ作業していません)。fファイルのどの位置?最初の文字の前ですか?

第二に、私が使用するとき:

fseek(f, -1, SEEK_CUR);
fputc(' ', f);

ポインターのf現在の位置は?

4

4 に答える 4

2

マニュアルを読むことはあなたを助けるはずです。

For fopen: ストリームはファイルの先頭に配置されます。のようなモードを除いて'a'

For fseek: その関数は失敗する可能性があるため、戻り値をテストする必要があります。負のオフセットが得られないことは想像に難くありません。

于 2016-01-03T16:25:57.133 に答える
1
  • C を介してファイルにアクセスする場合、最初に必要なのは、ファイルにアクセスする方法を用意することです。C ファイル I/O の場合、FILE ポインタを使用する必要があります。これにより、プログラムはアクセス中のファイルを追跡できます。例えば:

     FILE *fp;
    
  • ファイルを開くには、FILE ポインターを返す fopen 関数を使用する必要があります。ファイルを開いたら、FILE ポインターを使用して、コンパイラーがファイルに対して入出力関数を実行できるようにします。

    FILE *fopen(const char *filename, const char *mode);
    
  • ここで filename は、ファイルに名前を付けるために使用する文字列リテラルであり、mode は次のいずれかの値を持つことができます

    w  - open for writing (file need not exist)
    a   - open for appending (file need not exist)
    r+ - open for reading and writing, start at beginning
    w+ - open for reading and writing (overwrite file)
    a+ - open for reading and writing (append if file exists)
    
  • 以下は fseek() 関数の宣言です。

    int fseek(FILE *stream, long int offset, int whence)
    
    SEEK_SET    Beginning of file
    SEEK_CUR    Current position of the file pointer
    SEEK_END    End of file
    
  • 次の fputc() の例:

    /* fputc example: alphabet writer */
     #include <stdio.h>
    
     int main ()
     {
        FILE * pFile;
         char c;
    
        pFile = fopen ("alphabet.txt","w");
         if (pFile!=NULL) {
    
          for (c = 'A' ; c <= 'Z' ; c++)
          fputc ( c , pFile );
    
          fclose (pFile);
        }
        return 0;
       }
    
于 2016-01-04T07:18:16.987 に答える
1

ファイルを開くと、現在の位置は最初の文字の0,になります。

fseekファイルの先頭より前にしようとすると、fseek失敗して が返され-1ます。

テキスト ファイルを逆方向​​にシークしても、成功する保証はないことに注意してください。Linux および/またはバイナリ ストリームの場合、ストリームの先頭にいないと仮定し、実際のファイルの書き込みモードで開いて、シーケンスの後に

fseek(f, -1L, SEEK_CUR);
fputc(' ', f);

ストリームの位置は の前と同じになりfseekます。

しかし、この一見単純な例を考えてみましょう:

fputc('\n', f);
fseek(f, -1L, SEEK_CUR);

Windows などのシステムで'\n'は、ある時点で が 2 バイトのシーケンスに変換されますが<CR><LF>、何をすべきだと思いますか?

これらすべての失敗の可能性 (およびさらにいくつかの特殊な可能性) があるため、常に の戻り値をテストし、fseekその使用を最小限に抑えるようにしてください。

于 2016-01-03T16:29:01.087 に答える
0

たとえば、ファイル ポインターが100 番目の オフセットにあり、書き込むfseek(f, -1, SEEK_CUR);とオフセットが 99 番目の位置になり、ファイル ポインターのオフセットを使用してスペースを書き込んだ後、99 番目の位置にスペースを書き込む場合、現在の位置/オフセットによって異なります。また。fputc(' ', f);

于 2016-01-03T20:38:14.463 に答える