C/C++ · 2 min read · Oct 09, 2025
C/C++を段階的に学ぶ - ページ12
12. 段階的なCorC++ — Cプログラミング - ファイル
ファイル処理
はじめに
次のプログラムの出力を見てみましょう。
| |
|
はい、これは学生情報のレコードを受け取り、それを表示します。
こちらは同じプログラムですが、いくつかの修正を加えた文が含まれています。
| |
|
上記の2つのプログラムは同じですが、2番目のプログラムには強調表示された文( FILE *fp = fopen(“stud.dat”, “a+”);)と、‘f printf’や‘ fp’のようないくつかの修正が含まれています。これらの修正は、コンソールからディスクにデータを転送するのに影響を与えます。ファイル stud.dat に保存されます。このプロセスは ファイル制御/ファイル管理/ファイル組織 として知られています。
これは、ファイル制御文を使用してモニターからファイルに出力を転送する最も簡単な方法です。
| |
|
実際、ファイル処理には多くの操作と実装方法が関与しています。ここにファイルを処理する実際のプロセスがあります。
ファイル処理
一般的に、すべてのプログラムは結果の値を画面に表示する必要があります(1番目のプログラムがこれを示しています)。しかし、プログラムが終了すると、これらの値はメモリから削除されます。記録を永続的に保持したい場合は、ファイルに保存します。すべてのファイルにはいくつかの操作があります。ここにいくつかの操作があります;
| |
|
| |
|
ファイル操作
| fopen | ストリームファイル名をモードで開き、成功した場合は新しく開いたストリームへのポインタを返します。そうでない場合はNullを返します。 |
| 構文 ** | FILE fopen(const char filename, const char *mode); |
| 例 | FILE fp = fopen(“stud.dat”, “r”); / ファイルから読み取る /
FILE fp = fopen(“emp.dat”, “w”); / ファイルに書き込む /
FILE fp = fopen(“emp.dat”, “a+”); / ファイルに読み書きする / | | | モード:
fopenへの呼び出しで使用されるモード文字列は、次のいずれかの値の1つです: モード 説明 r 読み取り専用で開く w 書き込み用に作成する(その名前のファイルがすでに存在する場合、上書きされます)。 a 追加;ファイルの末尾で書き込み用に開く、またはファイルが存在しない場合は書き込み用に作成します。 r+ 既存のファイルを更新(読み取りおよび書き込み)用に開く w+ 更新(読み取りおよび書き込み)用に新しいファイルを作成します。
その名前のファイルがすでに存在する場合、上書きされます。 a+ 追加用に開く;ファイルの末尾で更新用に開く、またはファイルが存在しない場合は作成します。指定されたファイルがテキストモードで開かれているか作成されていることを指定するには、文字列に「 t 」を追加します( rt, w+t, など)。
バイナリモードを指定するには、文字列に「 b 」を追加します( wb, a+b, など)。 | | fclose | fpが指すファイルを閉じ、成功時に0を返し、エラーの場合はEOFを返します。 | | 構文 | Int fclose(FILE fp); | | 例 | Fclose(fp); fclose(stud); fcloseall(); | | fprintf | フォーマットされた出力をストリームに送信します。printfと同じフォーマット指定子を使用しますが、指定されたストリームに出力を送信します。出力されたバイト数を返すか、エラーの場合はEOFを返します。 | | 構文 | Fprintf(fptr, “制御文字列”, リスト); | | 例 | Fprintf(fp, “%d %s %d %d %d”, sno, name, sub1, sub2, sub3);
fprintf(emp, “%d %s %d”, eno, name, sal); | | fscanf | この関数は、指定されたファイルからフォーマットされたデータを読み取るために使用されます。 | | 構文: | Fscanf(fptr, “制御文字列”, リスト); | | 例 | Fscanf(fp, “%d %s %d %d %d”, &sno, name, &sub1, &sub2, &sub3);
fscanff(emp, “%d %s %d”, &eno, name, &sal); | | fwrite ** | Fwriteは、指定された数の同サイズのデータ項目を出力ファイルに追加します。 | | 構文: | Size_t fwrite(const void ptr, size_t size, size_t n, FILEstream);
引数 それが何か/すること
Ptr 任意のオブジェクトへのポインタ;書き込まれるデータはptrから始まります
Size 各データ項目の長さ
N 追加されるデータ項目の数
stream 出力ファイルを指定します
書き込まれるバイトの合計数は ( n * size) | | fread | Freadは、入力ファイルから指定された数の同サイズのデータ項目を取得します。 | | 構文 | Size_t fread(void ptr, size_t size, size_t n, FILEstream);
引数 それが何か/すること
Ptr 任意のオブジェクトへのポインタ;書き込まれるデータはptrから始まります
size 各データ項目の長さ
n 追加されるデータ項目の数
stream 出力ファイルを指定します
書き込まれるバイトの合計数は ( n * size) | | rewind | ファイルポインタをストリームの先頭に再配置します | | 構文 | Void rewind(FILE *stream);
例。 fewind(fp);
Rewind(stream)はfseek(stream, 0L, SEEK_SET)に相当しますが、rewindはファイルの終わりとエラーインジケーターをクリアし、fseekはファイルの終わりインジケーターのみをクリアします。rewindの後、更新ファイルに対する次の操作は入力または出力のいずれかになります。 | | fseek | ストリームのファイルポインタは、whenceで指定された位置から計算されたオフセットバイト数に位置付けられます。オフセットはゼロ、負、または正である可能性があります。定義されたシンボルSEEK_CUR、SEEK_SETおよびSEEK_ENDは、現在の位置を示すためのwhence指定子として使用されます。BOFおよびEOFそれぞれ。成功した場合は0を返し、失敗した場合は非ゼロを返します。 | | 構文 | Int fssek(FILE *stream, long offset, int whence); | | ftell | 成功時に現在のファイルポインタの位置を返し、エラー時には負の値を返します。 | | 構文 | Long ftell(FILE stream); | | feof | ストリームでファイルの終わりに達した場合に非ゼロを返すマクロです。 | | 構文 | Int feof(FILE stream); | | eof | ハンドルによって与えられたファイル内の位置マーカーがファイルの終わりにあるかどうかをチェックします。はいの場合は0を返し、位置マーカーがEOFでない場合は1が返され、errnoの設定によってエラーが示され、戻り値は–1になります。 | | 構文 | Int eof(int handle); | | fgets / fputs | 関数fgets/fputsは、ストリームによって指されるファイルに文字列(nバイトのサイズ)を取得/配置し、エラー時にファイルの終わりを返します。 | | 構文 | Char fgets(char s, int n, FILE stream); | | fgetc/fputc 構文 | ストリームから文字を読み取ります/書き込みます。 Int fgetc/fputc(FILE stream); | | fgetchar/ fputchar | これらは上記のfgetc/fputcに相当します。 |
学生データを読み取り、データファイルに保存するプログラムを書いてください。
| | / 学生データファイルを作成するプログラム /
/ 85_write.c /
#include
#include
#include
int main()
{
int sno, sub1, sub2, sub3;
char name[10],ch;
FILE *fp = fopen(“stud.dat”, “w”);
do{
clrscr();
printf(“学生番号を入力してください “); scanf(“%d”, &sno);
printf(“学生名を入力してください “); scanf(“%s”, name);
printf(“3科目の成績を入力してください “);
scanf(“%d%d%d”, &sub1, &sub2, &sub3);
fprintf(fp, “%d %s %d %d %d\n”, sno, name, sub1, sub2, sub3);
printf(“\n\n続けますか… (y/n)”); ch = getche();
}while(toupper(ch) != ‘N’);
fclose(fp);
return 0;
} |
学生データファイルからデータを取得するプログラムを書いてください。
| | / 学生データファイルからデータを取得するプログラム /
/ 86_read.c /
#include
#include
int main()
{
int sno, sub1, sub2, sub3;
char name[10];
FILE *fp = fopen(“stud.dat”, “a+”);
clrscr();
printf(“学生記録は次のとおりです….\n”);
do{
fscanf(fp, “%d%s%d%d%d\n”, &sno, name, &sub1, &sub2, &sub3);
printf(“%5d%15s%3d%3d%3d\n”, sno, name, sub1, sub2, sub3);
}while(!feof(fp));
fclose(fp);
return 0;
} |
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。