邪魔な行末の改行のない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;]