最後のメモでは、fopen関数とfclose関数について説明しました。このメモでは、fgetc_fputc関数、fgets_fputs関数、およびfread_fwrite関数について説明しました。
1.一度に1文字ずつ読み書きします
関数宣言:
int fgetc(FILE * stream);
機能の説明:
fgetcは、streamで識別されるファイルからバイトを読み取り、バイト値を返します。
戻り値:
tの方法:ファイルの終わりを読み取り、EOFを返します(EOFはstdio.hファイルで定義されたシンボリック定数であり、値は-1です)
bの方法:ファイルの終わりを読み取り、feof(ファイルポインタ)を使用して終わりを判断します
feofはC言語の標準ライブラリ関数です。そのプロトタイプはstdio.hにあります。その関数は、ストリーム上のファイルの終わりを検出することです。ファイルが終了すると、ゼロ以外の値を返します。それ以外の場合は、0を返します。
関数宣言:
int fputc(int c、FILE * stream)
関数の説明:
fputcは、cの値をstreamで表されるファイルに書き込みます。
戻り値:
出力が成功した場合は、出力のバイト値を返します
出力が失敗した場合にEOFを返します
※※注:ファイルを開くときのデフォルトの読み取り/書き込み位置はファイルの先頭です。読み取り/書き込み位置をファイルの最後にaの形式で開くと、読み取り/書き込み位置になります。ファイルへのバイトの読み取りまたは書き込み時にファイルにバイトを書き込みます。終了オフセット、読み取るバイト数、読み取りおよび書き込み位置がファイルの最後にオフセットされるバイト数。
例:
#include<stdio.h>
int main()
{
FILE *fp1,*fp2;
char ch;
fp1=fopen("test.txt","r");
if(fp1==NULL)
{
perror("fopen");
return 0;
}
fp2=fopen("test2.txt","w");
if(fp2==NULL)
{
perror("fopen");
return 0;
}
while((ch=fgetc(fp1))!=EOF)
{
fputc(ch,stdout);
fputc(ch,fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
test.txtファイルの内容:
test2.txtファイルは元々空のファイルでした。上記のプログラムを実行した後、test2.txtファイルの内容は次のようになります。
注:test2.txtファイルがない場合は、最初に空のtest2.txtファイルが作成されます。
次に、一度に1つの文字列を読み書きします
char * fgets(char * s、int size、FILE * stream);
ストリームで識別されるファイルから文字を読み取り、改行が検出されるかファイルの終わりが検出されると読み取りを停止するか、サイズ1バイトが読み取られて読み取りが停止され、コンテンツが読み取られます。「\0」は次のようになります。文字列の最後としてその後に追加されます。
戻り値:
配列の最初のアドレス、つまりsを正常に返します。
失敗するとNULLを返します。
int fputs(const char * s、FILE * stream);
機能機能:
sが指す文字列をstreamで表されるファイルに書き込みます。
戻り値:
成功時に書き込まれたバイト数を返します。
失敗すると-1を返します。
例:
#include<stdio.h>
int main()
{
FILE* fp_read,*fp_write;
char str[100];
fp_read=fopen("test.txt","r");
if(fp_read==NULL)
{
perror("fopen");
return 0;
}
fp_write=fopen("dest.txt","w");
if(fp_write==NULL)
{
perror("fopen");
return 0;
}
fgets(str,6,fp_read);
printf("str=%s\n",str);
fputs(str,fp_write);
return 0;
}
test.txtファイルの内容:
上記のプログラムを実行した後のdest.txtファイルの内容:
fgets(str、6、fp_read)の6が16に変更された場合、dest.txtファイルのコンテンツは次のようになります。 。
10文字しか読まないのは、helloworldの後に改行があるからです。
第三に、ファイルのfreadを読みます
関数宣言:
size_t_fread(void * ptr、size_t size、size_t nmemb、FILE * stream);
関数の説明:
fread関数は、streamで識別されるファイルからデータを読み取ります。各ブロックは、サイズバイト、合計nmembブロックであり、ptrhが指すメモリに格納されます。
戻り値:実際に読み取られたブロックの数。
例:
unsigned int num;
num = fread(str、100,3、fp);
fpで表されるファイルから読み取られたコンテンツは、strが指すメモリに格納され、読み取られるバイト数は1ブロックあたり100バイト、3ブロックです。戻り値num:
300バイトが読み取られた場合、戻り値は3です。
読み取られたバイト数が200以上300未満の場合、戻り値は2です。
読み取られたバイト数が100以上200未満の場合、戻り値は1です。
100バイト未満の場合は0を返します。
第四に、ファイルfwriteを書き込みます
関数宣言:
size_t fwrite(void * ptr、size_t size、size_t nmemb、FILE * stream);
関数の説明:
fwrite関数は、ptrが指すメモリ内のデータを、streamによって識別されるファイルに書き込みます。1つのブロックはサイズバイトで、合計はnmembブロックです。
戻り値:実際に書き込まれたブロックの数。
例:
#include<stdio.h>
struct stu
{
char name[10];
int num;
int age;
}stu1[2],stu2[2];
int main()
{
FILE *fp;
int i;
fp=fopen("student.txt","wb+");//把文件当作二进制文件打开
if(fp==NULL)
{
perror("fopen");
return 0;
}
for(i=0;i<2;i++)
{
scanf("%s %d %d",stu1[i].name,&(stu1[i].num),&(stu1[i].age));
}
fwrite(stu1,sizeof(struct stu),2,fp); //将学生信息写入文件中
rewind(fp); //文件指针经过写操作已经到了最后,需要复位
fread(stu2,sizeof(struct stu),2,fp); //将文件中的数据读入内存中
printf("%s %d %d\n",stu2[0].name,stu2[0].num,stu2[0].age);
printf("%s %d %d\n",stu2[1].name,stu2[1].num,stu2[1].age);
return 0;
}
※※知らせ:
fwrite関数は、メモリ内のデータをそのままファイルに出力する機能です。
fread関数は、ファイル内のデータをそのままメモリに読み込みます。(バイトごとに読み取る)
5、ランダムな読み取りと書き込み
ファイルのポジショニングを完了するための関数:巻き戻し、fseek関数
1.巻き戻しリセット読み取りおよび書き込み位置
巻き戻し関数: void rewind(ファイルポインタ);
機能:ファイルの内部位置ポインタをファイルの先頭に移動します
呼び出しフォーム: rewind(ファイルポインタ);
例:
fwrite(pa、sizeof(struct stu)、2、fp);
rewind(fp);
fread(pb、sizeof(struct stu)、fp);
2. ftellは、ファイルの先頭からファイルの読み取りおよび書き込み位置までのバイト数を測定します
関数を定義します: long ftell(ファイルポインタ);
機能:ファイルストリームの現在の読み取りおよび書き込み位置を取得します
戻り値:現在の読み取り/書き込み位置(ファイルの先頭からのバイト数)を返します。エラーの場合は-1を返します。
例:
longintの長さ;
長さ=ftell(fp);
3.fseekポジショニング位置ポインタ(読み取りおよび書き込み位置)
fseek関数(通常、バイナリファイルに使用されます。つまり、ファイルを開く方法にはbが必要です)
関数宣言:
int fseek(FILE * stream、long offset、int whence);
int fseek(ファイルタイプポインタ、変位、開始点);
オフセットは、ファイルの最後にオフセットするための正の数であり、ファイルの最初にオフセットするための負の数です。
機能:ファイルストリームの読み取りおよび書き込み位置を移動します。
開始位置
ファイルの開始 | SEEK_SET | 0 |
ファイルの現在の場所 | SEEK_CUR | 1 |
ファイルの終わり | SEEK_END | 2 |