ファイル全体の内容を読み取るCプログラム
C プログラミング言語 は、 stdio.h ヘッダー ファイルで定義されている、ファイルから内容を読み取るための 4 つの事前定義関数をサポートしています。
- fgetc() – この関数は、ファイルから 1 文字を読み取るために使用されます。
- fgets() – この関数は、ファイルから文字列を読み取るために使用されます。
- fscanf() – この関数は、フォーマットされた入力をファイルから読み取るために使用されます。
- フレッド() – この関数は、ファイルから生のバイトのブロックを読み取るために使用されます。これはバイナリ ファイルを読み取るために使用されます。
ファイルを読み取る手順:
- 関数 fopen() を使用してファイルを開き、ファイルの参照を FILE ポインタに保存します。
- これらの関数 fgetc()、fgets()、fscanf()、または fread() のいずれかを使用して、ファイルの内容を読み取ります。
- ファイルは関数 fclose() を使用してファイルを閉じます。
これらの各機能について詳しく説明していきます。
fgetc()
fgetc()はその時点で関数ポインタが指している文字を読み込みます。読み取りが成功するたびに、ストリームから読み取った文字 (ASCII 値) を返し、読み取り位置を次の文字に進めます。この関数は、読み取るコンテンツがない場合、または読み取りが失敗した場合、定数 EOF (-1) を返します。
構文:
int fgetc(FILE *ptr);
アプローチ:
- このプログラムは、この関数を使用して、文字を 1 つずつ読み取ることでファイルの内容全体を読み取ります。
- ファイルの終わりに達するまで文字を読み取る Do-while ループが使用されます。
- 終了に達すると、EOF 文字 (-1) を返します。
EOF の使用:
以下は、上記のアプローチを実装するための C プログラムです。
C
// C program to implement> // the above approach> #include> #include> #include> // Driver code> int> main()> {> > FILE> * ptr;> > char> ch;> > // Opening file in reading mode> > ptr => fopen> (> 'test.txt'> ,> 'r'> );> > if> (NULL == ptr) {> > printf> (> 'file can't be opened
'> );> > }> > printf> (> 'content of this file are
'> );> > // Printing what is written in file> > // character by character using loop.> > do> {> > ch => fgetc> (ptr);> > printf> (> '%c'> , ch);> > // Checking if character is not EOF.> > // If it is EOF stop reading.> > }> while> (ch != EOF);> > // Closing the file> > fclose> (ptr);> > return> 0;> }> |
入力ファイル:
techcodeview.com | A computer science portal for geeks
出力:
上記のコードでは、ファイルから 1 文字を読み取り、それが EOF ではないかどうかを確認し、EOF でない場合は出力し、EOF である場合は読み取りを停止します。
feof() の使用:
feof() 関数はファイル ポインタを引数として受け取り、ポインタがファイルの末尾に到達すると true を返します。
構文:
int feof(FILE *ptr);
アプローチ:
- このアプローチでは、文字は fgetc() を使用して読み取られます。
- feof() 関数を使用してファイルの終わりをチェックします。 feof() は最後に到達した後に true を返すためです。
- 論理否定演算子(!)を使用して、終了条件に達したときに false になり、ループが停止します。
以下は、上記のアプローチを実装するための C プログラムです。
C
// C program to implement> // the above approach> #include> #include> #include> // Driver code> int> main()> {> > FILE> * ptr;> > char> ch;> > ptr => fopen> (> 'test.txt'> ,> 'r'> );> > if> (NULL == ptr) {> > printf> (> 'file can't be opened
'> );> > }> > printf> (> 'content of this file are
'> );> > while> (!> feof> (ptr)) {> > ch => fgetc> (ptr);> > printf> (> '%c'> , ch);> > }> > fclose> (ptr);> > return> 0;> }> |
入力ファイル:
techcodeview.com | A computer science portal for geeks
出力:
fgets()
fgets() は、ファイルから一度に 1 つの文字列を読み取ります。 fgets() は、関数によって正常に読み取られた場合は文字列を返し、読み取れなかった場合は NULL を返します。
構文:
char * fgets(char *str, int サイズ, FILE * ptr);
ここ、
文字列: fgets()がファイルから読み込んだ文字列を格納する文字列です。
サイズ: ストリームから読み取る最大文字数です。
ポイント: ファイルポインタです。
アプローチ:
- このアプローチでは、ファイルの最後に到達するまで、ファイルの内容が一度に 1 文字ずつ読み取られます。
- ファイルの終わりに到達すると、 fgets() は読み取れず NULL を返し、プログラムは読み込みを停止します。
以下は、上記のアプローチを実装するための C プログラムです。
C
// C program to implement> // the above approach> #include> #include> #include> // Driver code> int> main()> {> > FILE> * ptr;> > char> str[50];> > ptr => fopen> (> 'test.txt'> ,> 'a+'> );> > if> (NULL == ptr) {> > printf> (> 'file can't be opened
'> );> > }> > printf> (> 'content of this file are
'> );> > while> (> fgets> (str, 50, ptr) != NULL) {> > printf> (> '%s'> , str);> > }> > fclose> (ptr);> > return> 0;> }> |
入力ファイル:
techcodeview.com | A computer science portal for geeks
出力:
fscanf()
fscanf() は、フォーマットされた入力をストリームから読み取ります。
構文:
int fscanf(FILE *ptr, const char *format, …)
アプローチ:
- fscanf は、フォーマットされたデータをファイルから読み取り、変数に格納します。
- バッファ内のデータは、ファイルの終わりに達するまでコンソールに表示されます。
C++
// C program to implement> // the above approach> #include> // Driver code> int> main()> {> > FILE> * ptr => fopen> (> 'abc.txt'> ,> 'r'> );> > if> (ptr == NULL) {> > printf> (> 'no such file.'> );> > return> 0;> > }> > /* Assuming that test.txt has content> > in below format> > NAME AGE CITY> > abc 12 hyderbad> > bef 25 delhi> > cce 65 bangalore */> > char> buf[100];> > while> (> fscanf> (ptr,> '%*s %*s %s '> ,> > buf)> > == 1)> > printf> (> '%s
'> , buf);> > return> 0;> }> |
出力:
フレッド()
fread() を使用すると、ファイルからデータのブロックを簡単に読み取ることができます。たとえば、ファイルから構造体を読み込む場合、fread を使用すると簡単に読み込むことができます。
構文:
size_t fread(void *ptr, size_t サイズ, size_t nmemb, FILE *stream)
ポイント: これは、最小サイズ size*nmemb バイトのメモリ ブロックへのポインタです。
サイズ: これは、読み取られる各要素のバイト単位のサイズです。
メンバ: これは要素の数であり、それぞれのサイズは size バイトです。
ストリーム: これは、入力ストリームを指定する FILE オブジェクトへのポインタです。
アプローチ:
- まず、指定された入力ストリームから size バイトのサイズを持つオブジェクトの count 数を読み取ります。
- 成功した場合の読み取りバイトの総量は (size*count) です。
- 番号によると、読み取られた文字数に応じて、インジケーター ファイルの位置が増分されます。
- 読み取られたオブジェクトが単純にコピー可能ではない場合、動作は未定義であり、サイズまたはカウントの値がゼロに等しい場合、このプログラムは単純に 0 を返します。
C++
// C program to implement> // the above approach> #include> #include> #include> // Structure to store> // course details> struct> Course {> > char> cname[30];> > char> sdate[30];> };> // Driver code> int> main()> {> > FILE> * of;> > of => fopen> (> 'test.txt'> ,> 'w'> );> > if> (of == NULL) {> > fprintf> (stderr,> > '
Error to open the file
'> );> > exit> (1);> > }> > struct> Course inp1 = {> 'Algorithms'> ,> > '30OCT'> };> > struct> Course inp2 = {> 'DataStructures'> ,> > '28SEPT'> };> > struct> Course inp3 = {> 'Programming'> ,> > '1NOV'> };> > fwrite> (&inp1,> sizeof> (> struct> Course),> > 1, of);> > fwrite> (&inp2,> sizeof> (> struct> Course),> > 1, of);> > fwrite> (&inp3,> sizeof> (> struct> Course),> > 1, of);> > if> (> fwrite> != 0)> > printf> (> 'Contents to file written successfully !
'> );> > else> > printf> (> 'Error writing file !
'> );> > fclose> (of);> > // File pointer to read from file> > FILE> * inf;> > struct> Course inp;> > inf => fopen> (> 'test.txt'> ,> 'r'> );> > if> (inf == NULL) {> > fprintf> (stderr,> > '
Error to open the file
'> );> > exit> (1);> > }> > while> (> fread> (&inp,> sizeof> (> struct> Course),> > 1, inf))> > printf> (> 'Course Name = %s Started = %s
'> ,> > inp.cname, inp.sdate);> > fclose> (inf);> }> |
出力: