続C言語教室 - 第2回 ファイル入力
さて復活の第1回でファイル出力を取り上げました、
続C言語教室 - 第1回 ファイル出力
出力したのですから、今度は入力です。キーボードからの入力に関してもC言語教室では端折ってしまったのですが、一般的には scanf という関数を使います。
#include <stdio.h>
void main() {
char buf[128]; // 128は適当
scanf("%s", buf);
printf("%s\n", buf); // 入力内容を確認するため
}
これでキーボードから”abc(Enter)”と打てば、”abc”が表示されます。
実に簡単です。ところがscanfの最初の引き数で指定する書式文字列には罠があって、同じコードで”hello world(Enter)”と入力すると出力されるのは”hello”だけです。これは”%s”という文字列を入力する指定がEnterまでではなく、空白(やタブなど)またはEnterまでという規則があるからです。
このように区切られた文字列が入力されるのであれば、書式指定の方も、それに合わせて “%s%s” と区切られた数だけの入力方法を指定しなければなりません。そしてそれに合わせて格納する文字配列変数も必要です。
#include <stdio.h>
void main() {
char buf0[128];
char buf1[128];
scanf("%s%s", buf0, buf1);
printf("%s %s\n", buf0, buf1);
}
これで”Hello World(Enter)”を入力して”Hello World”が出力されるようになります。
ファイルから入力する場合も全く同じことになります。予め”Hello World(Enter)”という内容のテキストファイルを”output.txt”という名前で作成し、これを読ませてみましょう。
#include <stdio.h>
void main() {
char buf0[128];
char buf1[128];
FILE *file = fopen("output.txt", "r");
fscanf(file, "%s%s", buf0, buf1);
fclose(file);
printf("%s %s\n", buf0, buf1);
}
ファイルを開くときは読み取りしか行わないのでモードとして”r”を指定します。
“output.txt”の内容を変更すれば、出力内容もそれに合わせて変わります。ただ区切られた2つの文字列が必要で、足りなければその部分は長さ0の文字列が得られ、余れば捨てられます。
ここまでで気がついたかもしれませんが、fscanfで読み込むのは、(ほぼ)同じ書式で出力した fprintf を使った場合でないとうまくいきません。対話的にscanfで読み込んだ場合には、うまく読み込めなかった場合に、その旨を出力して再度入力してもらうことも出来るとは思いますが、相手がファイルではエラーが出ても訂正してもらうなんてありえません。そういう訳で実際に fscanf で読み込みを行うことはあまりやらないのです。
では「どうするのかというと」というのを次回でやりましょうか。
scanf
scanfの魔界に興味のある方は以下のページもご参考に
【scanf】キーボード入力
scanfの様々な書式指定
文字列をscanf関数で扱うとき
【初心者向け】scanf()使用上の注意
標準入力 scanfの使用上注意点
ヘッダ画像は、以下のものを使わせていただきました。
https://www.irasutoya.com/2017/10/blog-post_403.html