邪魔な行末の改行のない1行文字列を読み込む関数fgets_mod()を作ってみよう。
関数fgetsが読み込む1行には行末に改行文字があれば,その改行文字も含んだ1行の文字列を取得する
関数fgets_modが読み込む1行では行末に改行文字があっても,その改行文字は含まない1行の文字列を取得する
(1)後で学習するポインタを使っているので,そこのところは後で理解しよう。
(2) mainでは,fgets(string,510,fp); が fgets_mod(string,510,fp); に変わっただけで,他には変化はない。
(3)新たに作成したfgets_mod()は引数および返す値がfgets()と同じになっている。
(4)新たに作成したfgets_mod()は内部でfgets()を使っている。
(5)この関数は行末に'\r'があっても取り除くようになっている。
fgets_mod(string,510,fp); は行末の邪魔な改行コード抜きで1行の文字列を読み込んでいるのがわかる。
邪魔な行末の改行のない1行文字列を読み込む関数fgets_mod()を使ったプログラム |
#include <stdio.h> #include <stdlib.h> char *fgets_mod(char buff[],int size,FILE *fp) { char *ptr; int i; ptr=fgets(buff,size,fp); if (ptr!=NULL) { i=0; while (buff[i]) { if (buff[i]=='\n' || buff[i]=='\r') buff[i]='\0'; i++; } } return ptr; } int main() { FILE *fp; char fname[]="Peter.txt"; char string[512]; /*読み込まれた1行文字列(文字コード)*/ int i; /*ファイルオープンの手続き*/ fp=fopen(fname,"r"); if (fp==NULL) { printf("can't open %s\n",fname); exit(1); } for (i=0; i<3; i++) { /*ファイル先頭の3行の文字列を読み込む*/ fgets_mod(string,510,fp); printf("%d行目文字列 [%s]\n",i,string); } /*ファイルクローズ*/ fclose(fp); return 0; } |
実行結果 |
0行目文字列 [Peter ran straight away to Mr. McGregor's garden,] 1行目文字列 [and squeezed under the gate!] 2行目文字列 [First he ate some French beans;] |