TIL

Today I Learned. 知ったこと、学んだことを書いていく

fopen(3)とfputc(3)でファイルに文字(バイト)を書き込む - C言語

ふつうのLinuxプログラミング でfopen(3)とfputc(3)が出てきたので、遊んでみた

fopen(3)の定義を見てみる

#include <stdio.h>

FILE * fopen(const char * restrict path, const char * restrict mode);

ファイルパスpathからストリームを作り、そのFILEポインタを返す。modeでどのようにファイルを開くかを指定できる

"w"モード

modeに"w"を指定することで、存在しないファイルを指定した場合に、ファイルを作成することができる。

// file_open_close.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    FILE *f;

    f = fopen(argv[1], "w");

    fclose(f);

    // stdlib.hをインクルードしないといけない
    exit(0);
}
$ ./file_open_close.c a.txt

上のように実行すると、a.txtがなければ、作成される!今は、何も書き込んでいないため、空のファイルになる。

a.txtに何か書き込んで、再度、./file_open_close.c a.txtを実行すると、a.txtに書き込んだ内容がなくなる。これは、modeが"w"の時には、ファイルが存在している場合、内容を全削除し、書き込みを開始するため。


fputc(3)の定義をみてみる

#include <stdio.h>

int fputc(int c, FILE *stream);

ストリームstreamに対して、文字cを書き込む。書き込みに成功したら、書き込んだ文字を返す。エラーが起きた場合にはEOF(-1)を返す。

文字(バイト)を書き込んでみる

fputc(3)を使えばできるのかと思って、以下のようにやってみたけど、できなかった。

できなかったのは、よくわからない文字コード(CRって文字?の文字コード)を渡していたため

f = fopen(argv[1], "w");

fputc(13, f);

fclose(f);

13がだめなのかな?

→intだから、数字じゃなきゃだめなのかと思ってたけど、そういうわけではないらしい...文字(char)であればいけるっぽい!!

f = fopen(argv[1], "w");

// 13 から 't' にしてみた
fputc('t', f);

fclose(f);

おぉ!!書き込まれた!!

もう少し、C言語について理解しないとだめですね...(int ってなってても、文字が行けるのはなぜだ...)

引数のint cについて

intというのは、文字コードなのかも!!97を渡したら、aが書き込まれたから、文字コード!!!

文字コードについてはC言語入門 第9回 文字・文字列の使い方を見て、少しだけわかったようなきがする。

参考文献