ホームページ  >  記事  >  バックエンド開発  >  C ベースのファイル操作 (FILE*、fstream、windowsAPI)

C ベースのファイル操作 (FILE*、fstream、windowsAPI)

php是最好的语言
php是最好的语言オリジナル
2018-08-10 11:27:392458ブラウズ

C ベースのファイル操作

ANSI C では、ファイル操作は、次に説明するストリーミング ファイル操作と I/O ファイル操作の 2 つの方法に分けられます。

1. ストリーミング ファイル操作

このファイル操作メソッドには重要な構造 FILE があり、FILE はヘッダー ファイル stdio.h で次のように定義されています:

typedef struct {int level;unsigned flags;char fd;unsigned char hold;int bsize;unsigned char _FAR *buffer;unsigned char _FAR *curp;unsigned istemp;short token;
} FILE;

FILE This構造体には、ファイル操作の基本属性が含まれています。ファイル操作は、この構造体のポインタを介して実行する必要があります。そのようなファイル操作によく使用される関数を次の表に示します。 関数 function
fopen() Open stream
fclose () ストリームを閉じる
fputc() ストリームに文字を書き込む
fgetc() ストリームから文字を読み取る
fseek() ストリーム内で指定された文字を検索する
fputs() を書き込む文字列をストリームに送信
fgets() ストリームから行を読み取るか、文字を指定します
fprintf() 形式でストリームに出力します
fscanf() 形式でストリームから読み取ります
feof()ファイルの終端に到達しました 真の値を返します
ferror() エラーが発生した場合にその値を返します
rewind() ファイルロケータをファイルの先頭にリセットします
remove() ファイルを削除します
fread() ストリーム文字から指定された数を読み取ります
fwrite() 指定された数の文字をストリームに書き込みます
tmpfile() 一時ファイルを生成しますstream
tmpnam() 固有のファイル名を生成します

以下は概要です これらの関数

1.fopen()
fopen のプロトタイプは次のとおりです: FILE *fopen(const char *filename, const char *mode)、fopen は 3 つの関数を実装します

用途 ストリームを開く
ファイルをこのストリームに接続
このストリームへの FILR ポインタを返す
パラメータ filename は開かれるファイル名を指し、mode は文字列を表します。オープンステータス。その値は次の表に示すとおりです。

文字列の意味
r 読み取り専用ファイルを開くには、ファイルが存在している必要があります。
r 読み書き可能なファイルを開きます。ファイルは存在する必要があります。
rb は読み書き用にバイナリ ファイルを開き、データの読み書きのみを許可します。
rt 読み取りと書き込み テキスト ファイルを開き、読み取りと書き込みを可能にします。
w 書き込み専用ファイルを開きます。ファイルが存在する場合、ファイル長は 0 にクリアされ、つまりファイルの内容は消去されます。ファイルが存在しない場合は、ファイルを作成します。
w 読み書き可能なファイルを開きます。ファイルが存在する場合、ファイル長はゼロにクリアされます。つまり、ファイルの内容は消去されます。ファイルが存在しない場合は、ファイルを作成します。
a 書き込み専用ファイルを追加モードで開きます。ファイルが存在しない場合はファイルが作成され、ファイルが存在する場合は書き込まれたデータがファイルの末尾に追加され、ファイルの元の内容が保持されます。 (EOF 文字は予約されています)
a 読み書き可能なファイルを追加モードで開きます。ファイルが存在しない場合はファイルが作成され、ファイルが存在する場合は書き込まれたデータがファイルの末尾に追加され、ファイルの元の内容が保持されます。 (元の EOF 文字は保持されません)
wb 書き込み専用の新しいバイナリ ファイルを開くか作成します。データ書き込みのみが許可されます。
wb read and write はバイナリ ファイルを開くか作成し、読み取りと書き込みを可能にします。
wt 読み取りと書き込み テキスト ファイルを開くか作成します。読み取りと書き込みが可能です。
at は読み取りと書き込みのためにテキスト ファイルを開き、テキストの末尾にデータを読み込んだり追加したりすることができます。
ab は、読み取りと書き込みのためにバイナリ ファイルを開き、ファイルの末尾へのデータの読み取りまたは追加を可能にします。

ファイルはテキスト モードまたはバイナリ モードで開くことができます。この 2 つの違いは、テキスト モードではキャリッジ リターンが 1 文字 '\n' とみなされ、バイナリ モードではキャリッジ リターンが 1 文字とみなされます。 2 つの文字 0x0D、0x0A として; ファイル内で 0x1B が読み取られた場合、テキスト モードはこれがファイルの終わりの文字であると判断します。つまり、バイナリ モデルはファイルを処理せず、テキスト モードはそれに応じてデータを変換します。ある意味で。

システムのデフォルトはテキスト モードで開きます。この設定を変更するには、すべての変数 _fmode の値を変更できます。たとえば、_fmode=O_TEXT; デフォルトの開始モードをテキスト モードに設定し、_fmode=O_BINARY と設定します。 ; 次に、デフォルトの開始モードをバイナリ モードに設定します。

この関数は FILE ポインターを返すため、FILE ポインターを宣言した後に初期化する必要はありません。代わりに、 fopen() を使用してポインターを返し、それを特定のファイルに接続します。成功した場合、または失敗すると NULL が返されます。

例:

FILE *fp;
if(fp=fopen(“123.456”,”wb”))
puts(“ファイルが正常に開きました”);
else
puts("ファイルを開く成功または失敗");

2.fclose()
fclose() の関数は、fopen() で開いたファイルを閉じることです。プロトタイプは: int fclose( FILE *fp); 成功した場合は 0 を返し、失敗した場合は EOF を返します。

プログラムが終了するときは、開いているファイルを必ず閉じることを忘れないでください。そうしないと、データが失われる可能性があります。私は以前にこの間違いをよく犯しました。

例: fclose(fp);

3.fputc()
ストリームに文字を書き込み、プロトタイプは int fputc(int c, FILE *stream); これを返します文字が成功すると、失敗すると EOF が返されます。

例: fputc('X',fp);

4.fgetc()
ストリームから文字を読み取り、プロトタイプは int fputc(FILE *stream); 戻り値成功した場合、この文字は失敗した場合に EOF を返します。

例: char ch1=fgetc(fp);

  1. fseek()
    この関数は通常、バイナリ モードで開かれたファイルで使用されます。 locate ストリーム内の指定された位置、プロトタイプは int fseek(FILE *stream, long offset, int whence); 正常に 0 が返された場合、パラメータの offset は移動された文字数であり、wherece は移動のベースであり、値は

    です

シンボリック定数値のベース位置
SEEK_SET 0 ファイルの先頭
SEEK_CUR 1 現在の読み取りおよび書き込み位置
SEEK_END 2 ファイルの末尾

例: fseek(fp, 1234L,SEEK_CUR);//読み取りおよび書き込み位置を現在位置から 1234 バイト後方に移動します (L サフィックスは長整数を示します)

fseek(fp,0L,2 );//読み取りと書き込みの位置をファイルの終わりに移動します

6.fputs()
文字列をストリームに書き込みます、prototype int fputs(const char *s, FILE *stream);

例: fputs("I Love You",fp);

7.fgets()
ストリームから行を読み取るか、文字を指定します。プロトタイプは char *fgets(char *s, int n, FILE *stream); from ストリームから n-1 文字を読み取ります。1 行が読み取られない限り、パラメータ s を使用して文字列を受け取ります。成功した場合は s のポインタが返され、それ以外の場合は NULL が返されます。戻ってきた。

例: ファイルの現在位置のテキストが次の場合、

Love ,I Have

But……..

If you use

fgets(str1,4,file1);

実行後、str1="Lov"、4-1=3 文字が読み取られ、

fgets(str1 , 23,file1);

次に、str="Love,I Have" を実行し、1 行を読み取ります (行末の '\n' を除く)。

8.fprintf()
形式に従ってストリームに入力、そのプロトタイプは int fprintf(FILE *stream, const char *format[, argument, …]) です; 使用法は同じですprintf() として、ただし、コンソールではなくストリームに書き込まれます。

例: fprintf(fp,”-%s”,4,”Hahaha”);

9.fscanf()
形式でストリームから読み取り、そのプロトタイプは int fscanf(FILE *stream, const char *format[, address, …]); 使用方法は scanf() と同じですが、コンソールから読み取るのではなく、ストリームから読み取るだけです。

例: fscanf(fp,”%d%d”,&x,&y);

10.feof()
ファイルの終わりに達したかどうかを確認し、そうでない場合は true を返し、それ以外の場合は 0 を返します。プロトタイプは int feof(FILE *stream);

例: if(feof(fp))printf("ファイルの終わりに達しました");

11.ferror()
プロトタイプは int ferror(FILE *stream); ストリームの最新のエラー コードを返しますが、これは clearerr() でクリアできます。clearerr() のプロトタイプは次のとおりです。 void clearerr(FILE *stream);

例: printf("%d",ferror(fp));

12.rewind()
現在の読み取りおよび書き込み位置を返します。プロトタイプは void rewind(FILE *stream); 実際、この関数は fseek(fp,0L,SEEK_SET);

例: rewind(fp);# と同等です。

##13.remove()

ファイルを削除します。プロトタイプは int delete(const char * filename); パラメータは削除するファイルの名前で、成功すると 0 が返されます。

例:remove(“c:\io.sys”);

14.fread()

指定された数の文字をストリームから読み取ります。プロトタイプは size_t fread( void
ptr, size_t size, size_t n, FILE *stream); パラメータ ptr は読み取ったデータを保存するためのもので、 void のポインタは char* や int * など任意の型のポインタに置き換えることができます, など; size はブロックあたりのバイト数; n は読み取られたブロック数です。成功した場合、(バイト数ではなく) 実際に読み取られたブロック数が返されます。この関数は通常、バイナリで開かれたファイルで使用されますモード。

例:

char x[4230];

FILE *file1=fopen(“c:\msdos.sys”,”r”);

fread (x,200,12,file1);//合計200*12=2400バイトを読み込み

15.fwrite()

freadに相当し、指定されたデータをストリームに書き込み、プロトタイプとなります。 size_t fwrite(const void
ptr, size_t size, size_t n, FILE *stream); パラメータ ptr は書き込まれるデータ ポインタです。 void のポインタは、次のような任意のタイプのポインタで置き換えることができます。 char*、int * などを置き換えます。size は各ブロックのバイト数です。n は書き込まれるブロックの数です。成功した場合は、書き込まれた実際のブロック数 (バイト数ではありません) を返します。これは関数は通常、ファイルをバイナリ モードで開くために使用されます。

例:

char x[]=”I Love You”;

fwire(x, 6,12,fp);//6*12=72 バイトを書き込みます

「I Love」をストリーム fp に 12 回、合計 72 バイト書き込みます

16.tmpfile()

プロトタイプは FILE *tmpfile(void); 一時ファイルを生成します、「w b」モードで開かれ、この一時ストリームのポインタを返すか、失敗した場合は NULL を返します。プログラムの終了時に、このファイルは自動的に削除されます。

例: FILE *fp=tmpfile();

17.tmpnam();

プロトタイプは char *tmpnam(char *s); で一意のファイル名を生成します。実際、tmpfile() はこの関数を呼び出します。パラメータ s は、取得したファイル名を保存し、このポインタを返すために使用されます。失敗した場合は、NULL が返されます。

例: tmpnam(str1);

2. 直接 I/O ファイル操作

これは、C によって提供される別のファイル操作であり、直接ストレージ/ファイルのフェッチを介して行われます。ファイルを実行してファイル処理を完了し、前の記事で説明したストリーミング ファイル操作はバッファを通じて実行されます。ストリーミング ファイル操作は FILE ポインターを中心に実行され、このタイプのファイル操作はファイルの「ハンドル」を中心に実行されます。ハンドルとは何ですか?これは、ファイルを識別するためにシステムによって使用される整数および一意のトークンです (WINDOWS では、ハンドルの概念はすべてのデバイス リソースの識別に拡張されます)。このようなファイル操作で一般的に使用される関数は次のとおりであり、これらの関数および使用されるシンボルの一部は io.h および fcntl.h で定義されており、使用する場合は対応するヘッダー ファイルを追加する必要があります。

関数の説明

open() ファイルを開き、そのハンドルを返します
close() ハンドルを閉じます
lseek() ファイルの指定された場所を見つけます
read() ブロックファイルを読み取ります
write() ファイルをブロック単位で書き込みます
eof() ファイルが終了しているかどうかをテストします
filelength() ファイルの長さを取得します
rename() ファイルの名前を変更します
chsize( ) ファイルの長さを変更します

これらの機能を以下で 1 つずつ説明します:

1.open()
ファイルを開いてそのハンドルを返します。失敗した場合は、0 未満の値が返されます。プロトタイプは int open(const char *path, int access [, unsigned mode] です) ); パラメータ path は開くファイルの名前、access は開くモード、mode はオプションです。ファイルの属性を示すパラメータで、主に UNIX システムで使用されますが、DOS/WINDOWS では意味がありません。ファイルを開くモードは次のとおりです。

シンボルの意味 シンボルの意味 シンボルの意味
O_RDONLY 読み取り専用モード O_WRONLY 書き込み専用モード O_RDWR 読み取り/書き込みモード
O_NDELAY UNIX システムで使用 O_APPEND 追加モード O_CREAT ファイルが存在しない場合は作成します
O_TRUNC ファイルの長さを 0 に切り詰めます。O_EXCL は O_CREAT とともに使用されます。ファイルが存在する場合は、エラー O_BINARY が返されます。バイナリ モード
O_TEXT テキスト モード

複数の要件については、次を使用できます。 O_APPEND|O_TEXT など、接続する「|」演算子 ファイルをテキスト モードおよび追加モードで開くことを示します。

例: int handle=open(“c:\msdos.sys”,O_BINARY|O_CREAT|O_WRITE)

2.close()
ハンドルを閉じます。プロトタイプは int です。 close (int handle); 成功した場合は、0

を返します。例: close(handle)

3.lseek()
指定された場所に移動します。プロトタイプは次のとおりです。long lseek( int handle, long offset, int fromwhere); パラメータ offset は移動量、fromwhere は移動の基準位置、値は前述の fseek() と同じ、 SEEK_SET: ファイルヘッダ; SEEK_CUR: 現在のファイル位置; SEEK_END: ファイルの終わり。この関数は実行後のファイルの新しいアクセス位置を返します。

例:

lseek(handle,-1234L,SEEK_CUR);//アクセス位置を現在位置から1234バイト先に移動します。
x=lseek(hnd1,0L,SEEK_END);//アクセス位置をファイルの末尾に移動します。x=ファイルの末尾の位置、つまりファイル長です

4 .read()
ファイルから ブロックを読み取ります。プロトタイプは int read(int handle, void *buf, unsigned len) です。パラメーター buf は読み取りデータを保存し、len は読み取りバイトです。この関数は、実際に読み取られたバイト数を返します。

例: char x[200];read(hnd1,x,200);

5.write()
データの一部をファイルに書き込みます。プロトタイプは int です。 write(int handle, void *buf, unsigned len); パラメータの意味は read() と同じで、実際に書き込まれたバイトが返されます。

例: char x[]=”I Love You”;write(handle,x,strlen(x));

7.eof()
feof()と同様、ファイルが終了したかどうかをテストし、1 を返し、それ以外の場合は 0 を返します。プロトタイプは次のとおりです: int eof(int handle);

例: while(!eof(handle1)){……};

8.filelength()
プロトタイプはlong filelength(int handle); lseek(handle,0L,SEEK_END)と同等です

例:long x=filelength(handle) );

9.rename()
ファイルの名前を変更します。プロトタイプは int rename(const char *oldname, const char *newname); パラメータ oldname は古いファイル名、newname はファイル名です。新しいファイル名。正常に返される場合は 0

例: rename(“c:\config.sys”,”c:\config.w40”);

10.chsize();
ファイルを変更しますlength 、プロトタイプは int chsize(int handle, long size) です。パラメータ size はファイルの新しい長さを表し、成功した場合は 0 を返し、それ以外の場合は -1 を返します。指定された長さがファイルの長さより小さい場合、ファイルは次のようになります。切り詰められます。指定した長さがファイルの長さを超える場合は、ファイルの末尾に「\0」を追加します。

例: chsize(handle,0x12345);


ストリーミング ファイル操作と同様に、_wopen() などの Unicode 文字操作の関数も提供します。 9X/NT でのワイド文字プログラミングについては、BCB のヘルプをご自身で確認してください。

また、この種の操作には、マルチユーザー操作用の lock()、unlock()、locking() などの関数もありますが、BCB ではあまり使用されないので、紹介するわけではありませんが、C を使って CGI を書きたい場合には、これらは必要な常識です。この点に関して要件がある場合は、自分でヘルプを参照する必要があります。

C ベースのファイル操作

C にはストリーム クラスがあり、ファイルについて知っておくべきことも含め、すべての I/O はこの「ストリーム」クラスに基づいています。 I/O、ストリーム クラスには 2 つの重要な演算子があります:

1. インサーター (3eb50d1c1ed83800a1be0c326db0bd36>)
ストリームからデータを入力します。たとえば、システムにはデフォルトの標準入力ストリーム (cin) があり、これは通常キーボードを指します。したがって、cin>>x; は、標準入力ストリームから指定された型 (つまり、変数 x の型) を読み取ることを意味します。 。 データ。

C では、ファイル操作はストリームのサブクラス fstream (ファイル ストリーム) によって実装されるため、この方法でファイルを操作したい場合は、ヘッダー ファイル fstream.h を追加する必要があります。ファイル操作のプロセスを 1 つずつ見てみましょう。

1. ファイルを開きます
fstream クラスには、ファイルを開くために使用されるメンバー関数 open() があります。そのプロトタイプは次のとおりです:

void open(const char* filename,int openmode,int access);

パラメータ:

filename: 開くファイルの名前
mode: 開く方法ファイル
アクセス: ファイルを開く属性
ファイルを開く方法は、クラス ios (すべてのストリーミング I/O クラスの基本クラス) で定義されます。一般的に使用される値は次のとおりです:

ios::app: ファイルを追加モードで開きます
ios::ate: ファイルが開かれると、ファイルはファイルの最後に配置され、ios:app にはこの属性が含まれます
ios:: binary: バイナリ モード ファイルで開きます。デフォルトのモードはテキスト モードです。 2 つの方法の違いは、前の記事に示されています。
ios::in: ファイルは入力モードで開かれます (file=>program)
ios::out: ファイルは出力モードで開かれます ( Program=>file)
ios::nocreate: ファイルを作成しないため、ファイルが存在しない場合は開くことができません
ios::noreplace: ファイルを上書きしないため、ファイルを開くことは失敗しますファイルが存在します
ios::trunc: ファイルが存在する場合は、ファイルを置き換えます 長さは 0 に設定されます
ios::out|ios::binary など、「または」を使用して上記の属性を接続できます

オープンファイルの属性値は次のとおりです:

0: 通常ファイル、オープンアクセス
1: 読み取り専用ファイル
2: 隠しファイル
4: システムfile
「または」または「 " を使用して、3 または 1 のように上記の属性を接続できます。2 は、読み取り専用および暗黙的な属性でファイルを開きます。

例: ファイル c:\config.sys をバイナリ入力モードで開きます

fstream file1;
file1.open("c:\config.sys",ios:: binary| ios::in,0);

open 関数のパラメーターがファイル名 1 つだけの場合、この関数は通常のファイル (

file1) の読み取り/書き込み用に開かれます。 open(“c:\config .sys”);96b4fef55684b9312718d5de63fb7121file1.open(“c:\config.sys”,ios::in|ios::out,0);

Inさらに、fstream には open( ) と同じコンストラクターと同じ関数もあります。上記の例では、ファイルは定義時に開くことができます:

fstream file1("c:\config.sys");

特別に提案されているのは、fstream には ifstream (入力ファイル ストリーム) と ofstream (出力ファイル ストリーム) の 2 つのサブクラスがあり、ifstream はデフォルトで入力モード (ファイル => プログラム) でファイルを開き、ofstream はファイルを次のように開きます。デフォルトでは出力モードになります。

ifstream file2("c:\pdos.def");//ファイルを入力モードで開きます
ofstream file3("c:\x.123");//ファイルを出力モードで開きますmode

したがって、実際のアプリケーションでは、さまざまなニーズに応じてさまざまなクラスを選択して定義します: 入力モードで開きたい場合は ifstream を使用して定義し、出力モードで開きたい場合は ofstream を使用して定義します; 入出力モードで開きたい場合は、fstream を使用して定義します。

2. ファイルを閉じる
開いたファイルは使用後に閉じる必要があります。fstream は、この操作を完了するためのメンバー関数 close() を提供します (例: file1.close()) ; file1 に接続されているファイルを閉じるだけです。

3. ファイルの読み取りと書き込み
ファイルの読み取りと書き込みは、テキスト ファイルとバイナリ ファイルに分かれています。テキスト ファイルの読み取りは、インサーターとエクストラクターを使用することで比較的簡単です。バイナリ読み取りの場合は、より複雑になります。以下では、これら 2 つの方法を詳しく紹介します。

1. テキスト ファイルの読み取りと書き込み
テキスト ファイルの読み取りと書き込みは非常に簡単です。ファイルに出力するにはインサータ (0d368380720a04ae1c261f19e52d9811>) を使用します。 file1 が入力として開かれ、file2 が出力として開かれると仮定します。例は次のとおりです:

file2ea4a1fdc68d8b40333f0254ab3028f0b>i; に書き込みます。 //From File 入力は整数値です。

このメソッドには、単純なフォーマット機能もあります。たとえば、出力を 16 進数などに指定できます。特定のフォーマットは次のとおりです。

マニピュレーター関数の入力/出力
dec 10 進数値データの入出力をフォーマットします。
endl は改行文字を出力し、このストリームをフラッシュします。出力
ends はヌル文字を出力します。出力
hex 16 進数値データの入出力をフォーマットします。
oct 8 進数値データ入力としてフォーマットします。
setpxecision(int p) 浮動小数点出力の精度桁数を設定します

たとえば、123 を 16 進数で出力するには: file1<<< ;123;5 桁で 3.1415926 を出力するには精度: ファイル 1

2. バイナリファイルの読み書き
①put()
put() 関数はストリームに文字を書き込みます。そのプロトタイプは ofstream &put(char ch) です。使用方法も比較的単純で、file1.put('c'); のように文字 'c' をストリームに書き込みます。

②get()
get() 関数はより柔軟で、一般的に使用される 3 つのオーバーロード形式があります:

1 つは put() に対応する形式です: ifstream &get(char &ch ) ; 関数はストリームから文字を読み取り、結果を参照 ch に保存します。ファイルの最後に達した場合は、null 文字が返されます。たとえば、file2.get(x); は、ファイルから文字を読み取り、読み取った文字を x に保存することを意味します。

別のオーバーロードされたフォームのプロトタイプは次のとおりです: int get(); このフォームはストリームから文字を返します。ファイルの終わりに達すると、x=file2.get() のように EOF が返されます。 ; 上記の例の機能は同じです。

プロトタイプには別の形式もあります: ifstream &get(char *buf,int num,char delim='\n'); この形式は、num 文字読み込まれるまで、buf が指す配列に文字を読み込みます。または delim で指定された文字が検出されました。delim パラメーターが使用されていない場合は、デフォルトの改行文字 '\n' が使用されます。例:

file2.get(str1,127,'A');//ファイルから文字列 str1 まで文字を読み取り、文字 'A' が見つかるか 127 文字が読み取られたときに終了します。

③データ ブロックの読み取りと書き込み
バイナリ データ ブロックの読み取りと書き込みを行うには、メンバー関数 read() および write() を使用します。それらのプロトタイプは次のとおりです:

read(unsigned char *buf, int num );
write(const unsigned char *buf,int num);

read() は、ファイルから num 文字を buf が指すバッファに読み取ります。num 文字がまだ読み込まれていない場合は、ファイルの終わりに到達したら、メンバー関数 int gcount(); を使用して実際に読み取られた文字数を取得し、write() によって buf が指すキャッシュから num 文字をファイルに書き込みます。キャッシュの型は unsigned char * であることに注意してください。場合によっては型変換が必要になる場合があります。

例:

unsigned char str1[]=”愛してる”;
int n[5];
ifstream in(”xxx.xxx”);
ofstream out(“yyy.yyy”);
out.write(str1,strlen(str1));//すべての文字列 str1 を yyy.yyy
in.read((unsigned char* )n, sizeof(n));//指定された整数を xxx.xxx から読み取り、型変換に注意する
in.close();out.close();

four 、EOF を検出
メンバー関数 eof() は、ファイルの終端に到達したかどうかを検出するために使用されます。ファイルの終端に到達した場合は 0 以外の値が返され、そうでない場合は 0 が返されます。プロトタイプは int eof();

例: if(in.eof())ShowMessage("ファイルの終わりに達しました!");

5. ファイルの配置
と C ファイル操作の違いは、C I/O システムがファイルに関連付けられた 2 つのポインターを管理することです。 1 つはファイル内の入力操作の位置を示す読み取りポインターであり、もう 1 つは次の書き込み操作の位置を示す書き込みポインターです。入力または出力が行われるたびに、対応するポインタが自動的に変化します。したがって、C のファイルの位置決めは読み取り位置と書き込み位置の位置決めに分けられ、対応するメンバー関数は seekg() と seenp() で、seekg() は読み取り位置を設定し、seekp は書き込み位置を設定します。最も一般的な形式は次のとおりです:

istream &seekg(streamoff offset,seek_dir Origin);
ostream &seekp(streamoff offset,seek_dir Origin);

streamoff は iostream.h で定義されます。 , offsetで取得できる最大値を定義します Seek_dirは移動の基準位置を表します 以下の値の列挙です:

ios::beg: ファイルの先頭
ios ::cur: ファイルの現在位置
ios::end: ファイルの終わり
テキスト ファイルはシステムの文字解釈により期待値と異なる場合があるため、通常、これら 2 つの関数はバイナリ ファイルに使用されます。

例:

file1.seekg(1234,ios::cur);//ファイルの読み取りポインタを現在位置から 1234 バイト後方に移動します
file2.seekp( 1234 ,ios::beg);//ファイルの書き込みポインタをファイルの先頭から 1234 バイト戻します


WINAPI ベースのファイル操作

WINAPI は 2 つの 1 つのグループを提供しますファイル操作関数の 1 つは 16 ビット プログラムとの互換性を目的としており、比較的単純です。もう 1 つのグループは 32 ビット プログラム用に特別に設計されており、使用するのがより面倒です。以下に、これら 2 つの関数グループをリストします。

#1. 16 ビット プログラムと互換性のある一連の関数

⑴_lopen

プロトタイプ: HFILE _lopen(
LPCSTR lpPathName, // ファイル名
int iReadWrite //ファイルアクセスメソッド
);

関数: ファイルを開き、ハンドルを正常に返します。これと同様に、OpenFile()関数もあります。ヘルプファイルを自分で確認できます。 . .

パラメータの説明: lpPathName は開くファイル名、iReadWrite はファイル アクセス方法で、主に 3 つの方法があります:

OF_READ: 読み取り専用モードで開く

OF_READWRITE:読み取り専用モードで開く 書き込みモードで開く
OF_WRITE: 書き込み専用モードで開く
OF_SHARE_COMPAT などの属性もありますが、一般的に使用されるものではないので、一つ一つ紹介しません。

⑵_lclose()

プロトタイプ: HFILE _lclose( HFILE hFile);

関数: ファイルを閉じ、正常に 0 を返す

パラメータの説明: hFile: ハンドルクローズド

⑶_lread()

プロトタイプ: UINT _lread( HFILE hFile, // ファイルハンドル
LPVOID lpBuffer, // データを保存するバッファ
UINT uBytes // 読み取る長さ
);

関数: ファイルを読み取り、実際に読み取った文字数を返します。これと同様に、_hread() 関数があり、ヘルプ ファイルを自分で確認できます。

⑷_lwrite()

プロトタイプ: UINT _lwrite( HFILE hFile, // ファイルハンドル
LPCSTR lpBuffer, // データを保存するバッファ
UINT uBytes // 書き込まれる長さ
);

関数: ファイルを書き込み、実際に書き込まれた文字数を返します。これと同様に、_hwrite() 関数があり、ヘルプ ファイルを自分で確認できます。

⑸_llseek()

プロトタイプ: LONG _llseek( HFILE hFile, // ファイルハンドル
LONG lOffset, // 移動量
int iOrigin // 移動の基準位置
) ;

関数: ファイルの読み取りおよび書き込み位置を移動し、移動後のファイルの読み取りおよび書き込み位置を正常に返します。

パラメーターの説明: iOrigin の値は、次のいずれかです。次の 3 つの状況:

FILE_BEGIN: ファイル ヘッダー

FILE_CURRENT: 現在のファイルの場所
FILE_END: ファイル末尾
⑹_lcreat()
プロトタイプ: HFILE _lcreat( LPCSTR lpPathName, //作成するファイル名
int iAttribute // ファイル属性
);

関数: ファイルを作成し、そのハンドルを正常に返します

パラメータの説明: ファイル属性は次の値の合計:

0: 通常のファイル

1: 読み取り専用ファイル
2: 隠しファイル
4: システム ファイル
これらの関数の使用法は次のようになります。リストされている BCB ライブラリ関数。BCB ライブラリ関数を使用することをお勧めします。 BCB ライブラリ関数に基づいた以前のファイル操作を参照してください。

2. 32 ビット プログラムとの互換性

CreateFile
Open file
ファイルの読み取りと書き込みを行うには、まずファイル ハンドルを取得する必要があります。この関数 ファイルハンドル、この関数はファイルの世界への扉です。

ReadFile
ファイルからバイト情報を読み取ります。
ファイルを開いてファイル ハンドルを取得した後、この関数を通じてデータを読み取ることができます。

WriteFile
バイト情報をファイルに書き込みます。
ファイル ハンドルをこの関数に渡して、ファイル データを書き込むこともできます。

CloseHandle
ファイルハンドルを閉じます。
ドアを開けた後は、忘れずに閉める必要があります。

GetFileTime
ファイル時間を取得します。
利用可能なファイル時間は、作成時間、最終アクセス時間、最終書き込み時間の 3 つです。
この関数には、エントリ パラメータとしてファイル ハンドルも必要です。

GetFileSize
ファイル サイズを取得します。
ファイル サイズは数 G に達する可能性があるため (1G には 30 ビットが必要)、32 ビットの 2 バイト型では正確に表現できないため、リターン コードは下位 32 ビットを表し、終了パラメータが存在します。上位 32 ビットを渡すことができます。
この関数には、エントリ パラメータとしてファイル ハンドルも必要です。

GetFileAttributes
ファイル属性を取得します。
ファイルのアーカイブ、読み取り専用、システム、隠し、その他の属性を取得できます。
この関数にはパラメータとしてファイル パスのみが必要です。

SetFileAttributes
ファイル属性を設定します。
取得できれば当然設定できるはずです。
ファイルのアーカイブ、読み取り専用、システム、隠し、その他の属性を設定できます。
この関数にはパラメータとしてファイル パスのみが必要です。

GetFileInformationByHandle
すべてのファイル情報を取得
この関数は、サイズや属性など、上記すべての関数で取得できる情報を取得できますが、他では取得できない情報も含まれています例: ファイル ラベル、インデックス、リンク情報。
この関数には、エントリ パラメータとしてファイル ハンドルが必要です。

GetFullPathName
ファイル パスの取得: この関数は、ファイルのフル パス名を取得します。
ファイルが現在のディレクトリにある場合にのみ正しい結果が得られることに注意してください。本当のパスを取得したい場合。 GetModuleFileName 関数を使用する必要があります。

CopyFile
ファイルをコピー
注: コピーできるのはファイルのみであり、ディレクトリはコピーできません

MoveFileEx
ファイルの移動
ファイルとディレクトリの両方を移動することはできますが、移動することはできません。スパンドライブ文字。 (Window2000 で移動フラグを設定すると、ドライブ文字をまたいだ操作が可能になります)

DeleteFile
ファイルの削除

GetTempPath
Windows の一時ディレクトリのパスを取得します

GetTempFileName
Windows 一時ディレクトリ パスに一意の一時ファイルを作成します。

SetFilePoint
ファイル ポインタを移動します。
この関数は、ファイルに対する高度な読み取りおよび書き込み操作に使用されます。

ファイルのロックとロック解除

LockFile
UnlockFile
LockFileEx
UnlockFileEx

上記の 4 つの関数は、ファイルのロックとロック解除に使用されます。これにより、ファイルの非同期操作が可能になります。ファイルの異なる部分に対して別々の操作を同時に実行できます。

ファイルの圧縮と解凍

LZOpenFile
圧縮ファイルを読み取りのために開く

LZSeek
圧縮ファイル内の場所を検索

LZRead
圧縮ファイルの読み取り

LZClose
圧縮ファイルを閉じる

LZCopy
圧縮ファイルをコピーし、処理中に展開します

GetExpandedName
圧縮ファイルからファイル名を返します。

上記の 6 つの関数は、32 ビット API の小さな拡張ライブラリとファイル圧縮拡張ライブラリの関数です。ファイル圧縮は、compress コマンドを使用して作成できます。

ファイル イメージング/マッピング

32 ビット API は、ファイル イメージング/マッピングと呼ばれる機能を提供し、ファイルをアプリケーションの仮想メモリ空​​間に直接マッピングできるようにします。このテクノロジは、次の目的で使用できます。ファイルアクセスを簡素化し、高速化します。

CreateFileMapping
マッピングを作成して名前を付ける

MapViewOfFile
ファイル マッピングをメモリにロードします

UnmapViewOfFile
ビューを解放し、変更を元に書き込みますファイル

FlushViewOfFile
ビューの変更を更新してディスクに書き込みます

関連する推奨事項:

C# ファイルの書き込み操作 - Geek Academy C#ビデオ チュートリアル

C# Word 文書の作成、表の挿入、スタイルの設定などの操作の例

以上がC ベースのファイル操作 (FILE*、fstream、windowsAPI)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。