FILE
ポインタの操作とf
関数の仕組みについて疑問に思っていfputc
ます。
まず、ファイルを開くとき (書き込みや読み取りなど、まだ作業していません)。f
ファイルのどの位置?最初の文字の前ですか?
第二に、私が使用するとき:
fseek(f, -1, SEEK_CUR);
fputc(' ', f);
ポインターのf
現在の位置は?
FILE
ポインタの操作とf
関数の仕組みについて疑問に思っていfputc
ます。
まず、ファイルを開くとき (書き込みや読み取りなど、まだ作業していません)。f
ファイルのどの位置?最初の文字の前ですか?
第二に、私が使用するとき:
fseek(f, -1, SEEK_CUR);
fputc(' ', f);
ポインターのf
現在の位置は?
マニュアルを読むことはあなたを助けるはずです。
For fopen
: ストリームはファイルの先頭に配置されます。のようなモードを除いて'a'
For fseek
: その関数は失敗する可能性があるため、戻り値をテストする必要があります。負のオフセットが得られないことは想像に難くありません。
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;
}
ファイルを開くと、現在の位置は最初の文字の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
その使用を最小限に抑えるようにしてください。
たとえば、ファイル ポインターが100 番目の オフセットにあり、書き込むfseek(f, -1, SEEK_CUR);
とオフセットが 99 番目の位置になり、ファイル ポインターのオフセットを使用してスペースを書き込んだ後、99 番目の位置にスペースを書き込む場合、現在の位置/オフセットによって異なります。また。fputc(' ', f);