C言語ファイル操作まとめ

12342 ワード

まず、テキストファイルとバイナリファイルの違いを見てみましょう.
簡単に言えば、テキストファイルは文字によって符号化するファイルである.一般的な符号化形式、例えばASCII符号化およびUnicode符号化、例えば、アルファベットAはASCII符号化で10進数の65、バイナリの01000001である.文字0はASCII符号化で10進数の48、バイナリの00110000. . , ,01000001 01000001(65), , .C言語ではfopen関数でファイルを開くことができます.
FILE *fp=fopen(path,mode);

FILEは、ファイルに関する情報を格納構造体である.pathもmodeもconst char*タイプで、pathはファイルのパスである、相対パスであっても絶対パスであってもよい(c言語では''はエスケープを表すのでwindowsの下のパスでは'\で代用してもよいし'/'で代用してもよい)、modeは開くモードであり、ファイルを正しく開かなければfopenはNULLに戻るので、ファイル操作を使用する前にファイルが開くかどうかを簡単に判断する必要がある.テキスト・ファイルとバイナリ・ファイルによって異なるオープン・モードを選択できます.
mode
意味
説明
r
読み取り専用でファイルを開く
このファイルは存在する必要があります.
w
1つの(テキスト)ファイルのみを書き込みで開く
ファイルが存在する場合、長さは0になり、そのファイルの内容が消失する.存在しない場合はファイルを作成します.
a
1つの(テキスト)ファイルを書き込みおよび追加するだけで開く.ファイルの最後からデータを追加します.
ファイルが存在しない場合は、そのファイルが作成されます.ファイルが存在する場合、書き込まれたデータはファイルの最後に追加されます.すなわち、ファイルの元の内容は保持されます.
r+
ファイルを読み取り/書き込みで開く
ファイルの内容を変更しません.
w+
ファイルを読み取り/書き込みで開く
ファイルが存在する場合、長さは0になり、そのファイルの内容が消失する.存在しない場合はファイルを作成します.
a+
1つの(テキスト)ファイルを読み取り/書き込みおよび追加で開く.ファイルの最後からデータを追加します.
ファイルが存在しない場合は、そのファイルが作成されます.ファイルが存在する場合、書き込まれたデータはファイルの最後に追加されます.すなわち、ファイルの元の内容は保持されます.
バイナリファイルの場合:
mode
意味
説明
rb
バイナリファイルを読み取り専用で開く
このファイルは存在する必要があります.
wb  
1つのバイナリファイルのみを書き込みで開く
ファイルが存在する場合、長さは0になり、そのファイルの内容が消失する.存在しない場合はファイルを作成します.
ab
バイナリファイルを書き込みと追加で開きます.ファイルの最後からデータを追加します.
ファイルが存在しない場合は、そのファイルが作成されます.ファイルが存在する場合、書き込まれたデータはファイルの最後に追加されます.すなわち、ファイルの元の内容は保持されます.
rb+
読み込み/書き込みでバイナリファイルを開く
ファイルの内容を変更しません.
wb+
読み込み/書き込みでバイナリファイルを開く
ファイルが存在する場合、長さは0になり、そのファイルの内容が消失する.存在しない場合はファイルを作成します.
ab+
バイナリファイルを読み取り/書き込みおよび追加で開きます.ファイルの最後からデータを追加します.
ファイルが存在しない場合は、そのファイルが作成されます.ファイルが存在する場合、書き込まれたデータはファイルの最後に追加されます.すなわち、ファイルの元の内容は保持されます.
 
ファイルの使用が完了すると、fclose関数を使用してファイルを閉じる必要があります.
fclose(fp);

ファイルを閉じるプロセスは、以前に作成するFILEタイプの構造体の解放プロセスであるため、ファイルを閉じた後にfpポインタを使用することはない.
ファイルの操作について説明します.
まず、ファイルの内容の読み取りと書き込みである.よく使われる関数はたくさんありますが、まずfprint関数とfscanf関数を見てみましょう.fprintfとprintf関数の唯一の違いはprintfがstdout(標準出力)への書き込みを使用することであり、fprintfは最初のパラメータが書き込む内容を指定することである.最初のパラメータはFILEタイプのポインタで、書きたいストリームを指します.もちろん、stdout、stderrをパラメータとして使用することもできます.
 
FILE *fp=fopen("test.txt","w");
if(fp!=NULL){
    fprintf(fp,"Hello,world
"); }

fscanf関数の基本的な動作はscanfとほぼ同様である、これ以上説明する.
また、個々の文字の入出力には、個別の関数がある.
出力の関数:putchar()、putc、fputc;
int c='a';
FILE *fp=fopen("test.txt","w");
putchar(c);//putchar stdout 
fputc(c,fp);
putc(c,fp);//putc fputc test.txt 

ではputcとfputcの違いは何でしょうか.実際、fputcは関数であり、putcはマクロであり、putcの速度はfputcより速い.エラーが発生すると、上記の3つの関数はEOFを返します.そうしないと、書き込み文字を返します.
書き込み関数:getchar,fgetc,getc:
FILE *fp=fopen("test.txt","w");
int ch;// int , 
ch=getchar();// stdin 
ch=fgetc(fp);
ch=getc(fp);//fgetc getc test.txt 

getcはマクロであり、fgetcは関数であり、getcの速度はfgetcより速い.
ファイルの最後に達すると、これらの関数はEOFを返します.
ストリームから読んだ文字を戻す特殊な関数->ungetcもあります!例えば、今私は一連の数字を読みたいと思っています.
while(isdigit(ch=getc(fp)){
    ...;
}
ungetc(ch,fp);

しかしungetc関数は間違いやすいので、ファイルの位置決め関数について話してからこの問題を話しましょう.
完全な文字列を1行読み込むには、fputsとfgetsを使用します.
 
puts("hello,world");// stdout , "hello,world" 
fputs("hello,world",fp)// , 
char str[MAX_SIZE];
gets(str);// stdin , 
fgets(str,sizeof(str)-1,fp);//fgets 
// fgets 
//gets fgets NULL

バイナリファイルで比較的大きなファイルブロックを操作するにはfreadとfwrite関数を用いる.
fwrite関数は、1つの配列内の要素をファイルに書き込むために用いる、使用時の1つ目のパラメータは配列(ヘッダ要素)のアドレスであり、2つ目のパラメータは配列の各要素のサイズであり、3つ目のパラメータは書き込む要素の個数であり、4つ目のパラメータは配列のサイズである.
//a 
fwrite(a,sizeof(a[0]),sizeof(a)/sizeof(a[0]),fp);

明らかに、配列の一部のみがファイルに書き込まれるように、第2および第3のパラメータを変更することができる.
fwrite関数の戻り値は、エラーが発生しない限り、正常に書き込む要素(バイトではない)の数であり、通常は3番目のパラメータに等しい.
fread関数は、fwrite関数と同様に、ファイルの一部を配列に読み出すために使用され、読み込まれた要素(バイトではない)の個数を返し、エラー(またはファイルの末尾に読み込まれた)が発生すると、その戻り値が3番目のパラメータよりも小さくなる.
fread(a,sizeof(a[0]),sizeof(a)/sizeof(a[0]),fp);

実際には、この2つの関数は配列だけでなく、理論的には任意のデータ型に使用できます.特に構造に使用される場合が多いです.
typedef struct Student{
  int score;
  int id;
  char *name;
}studenr;

int main(){
  student s={70,201900130001,"bart"),s1;
  fwrite(&s,sizeof(s),1,fp);
  fread(&s1,sizeof(s),1,fp);
  return 0;
}

 
しかし、構造にポインタがあると、読み込んだポインタが無効になる可能性があるので注意してください.
最後にファイルの位置付けの問題を見てみましょう.
新しいファイルを開くと、カーソルを開くことができますか?ファイルポインタはカーソルに相当し、現在のファイルで操作する文字を位置決めするために使用される.Unixでは、ファイルには2つの異なるポインタ->読み取りポインタと書き込みポインタがあります.しかしWindows環境ではこの2つのポインタが統合されています.読み取りまたは書き込みモードでファイルを開くと、「カーソル」はファイルの先頭にあり、読み取りまたは書き込み操作が進行するにつれて自動的に後方に移動する.付加モードであれば、ファイルの位置はファイルの末尾にある.fseek関数を呼び出すことでカーソル位置の遷移を実現できる.
1 fseek(fp,0L,SEEK_SET);

fseek関数の第1のパラメータはファイルポインタであり、第2のパラメータはoffset、すなわち初期位置からのオフセット量である(ここではlongタイプであることに注意).3番目のパラメータはstdioで初期位置を調整する責任を負う.hには3つのマクロが定義され、それぞれ3つの異なる開始位置選択量を表す.
1 #define SEEK_SET 0
2 #define SEEK_CUR 1
3 #define SEEK_END 2
4 // , , 

エラーが発生するとfseekはゼロ以外の値を返し、そうでない場合は0を返します.
fseek関数は一般にバイナリファイルに用いられ、offset量はバイト数である.しかし、テキストファイルに使用する場合、2番目のパラメータは一般的に0に設定、fseek関数のみでファイルの末尾に移動する.fseek関数を使用する必要がある場合は、offsetのサイズを別の関数であるftellで取得する必要がある.
long file_pos=ftell(fp);

ftellは現在のファイルの場所を返し、データ型はlong.この数字はfseek関数のパラメータに用いることができる.ファイル時にバイナリファイルがある場合、戻り値はバイト単位でカウントされます.テキストファイルなら?これはよくわかりません.
またrewind関数は、ファイルの位置をファイルの先頭に設定する役割を果たす.
rewind(fp);

 
名前の変更や削除など、他のファイル操作もあります.
rename("test","test1");// test test1
remove("test1.txt");// 

 
また、ファイルの入出力利器として、ファイルのリダイレクトがある.stdin、stdoutによく関連しています.
freopen("C:\\project\\test.txt","r",stdin);// test.txt
feropen("C:\\project\\test1.txt","w",stdout);// 

ファイルを使用してキーボードから入力を受信したい場合は、stdinをコンソールにリダイレクトします.
freopen("CON", "r", stdin);//CON 
freopen("CON", "w", stdout);
// stdin ,