Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【C言語】ファイル読み書きを頑張るぞ

こんばんは葛の葉です。今日もC言語です。

FILE型を使うんざ

# include <stdio.h>

これが宣言されていればFILE型は使えるようになってます。ポインタ変数を渡して作成しましょう。FILE型で作ったポインタをfopen関数に渡してあげるとファイルが読み込まれるようです。

#include <stdio.h>

int main (){
    FILE *filep;
    filep = fopen("text.txt", "r");
}

fopen関数の第二引数に"r"としていますが、これはReadOnlyの意味のようです。ファイル読み込み時のモードがあって、今回は読み取り専で開いているということです。

#include <stdio.h>

int main (){
    FILE *filep;
    char str[255];
    filep = fopen("text.txt", "r");
    while(fgets(str, 255, filep) !=NULL){
        printf("%s", str);
    }    
    fclose(filep);
    return 0;
}

WHILE文でfget関数を回しています。これはfilepポインター変数から一行256バイト分をstr変数に代入しろという関数になります。フォルダの値が何もない場合はNULLを返します。つまり、最後の行が何もない場合はNULLを返します。NULLの場合はWHILEから抜けるように条件を記載しています。

Render unto Caesar.
Parable of the Good Samaritan.

text.txtは適当な文章を入れときます。あとはいつものようにコンパイルしてみましょ。

gcc ./file.c
./a.out
Render unto Caesar.
Parable of the Good Samaritan.

書き込みもしてみよう

fopen関数の第二引数を"w"とします。これはWriteの意味のようです。また、書き込むための関数であるfputs関数を使います。

#include <stdio.h>

int main (){
    FILE *filep;
    char str[255] = "パイロキネシス\n";
    filep = fopen("text.txt", "w");
    if (filep == NULL) {
        printf("ファイルがないよ\n");
    } else {
        printf("%sと書き込みます。\n", str);
        fputs(str, filep);
    }
    fclose(filep);
    return 0;
}

fileが見つからない場合はNULLになるので、if文でNULLかそうでないかを判定します。NULLでないのならfputs関数を使用します。fputs(文字列, FILEポインター)とします。

$ gcc file2.c 
$ ./a.out 
パイロキネシス
と書き込みます。

text.txtの中身はこのようになります。

パイロキネシス

前回まで存在していた2文章が消えました。どこいったんだ?

追記してみる

fopen関数の第二引数に"a"としています。これはAddの意味のようです。また効果がわかりやすいようにstrの値も変更します。

#include <stdio.h>

int main (){
    FILE *filep;
    char str[255] = "クリオキネシス\n";
    filep = fopen("text.txt", "a");
    if (filep == NULL) {
        printf("ファイルがないよ\n");
    } else {
        printf("%sと書き込みます。\n", str);
        fputs(str, filep);
    }
    fclose(filep);
    return 0;
}

実行すると以下のようになります。

パイロキネシス
クリオキネシス

f:id:Kuzunoha-NE:20191017203025p:plain