見出し画像

続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”が表示されます。

abc
abc

最初の行がキーから打ち込んだ文字のエコーバック。次の行が表示内容

実に簡単です。ところがscanfの最初の引き数で指定する書式文字列には罠があって、同じコードで”hello world(Enter)”と入力すると出力されるのは”hello”だけです。これは”%s”という文字列を入力する指定がEnterまでではなく、空白(やタブなど)またはEnterまでという規則があるからです。

Hello World(Enter)
Hello

入力した文字列の最初の空白までしか読み取られない

このように区切られた文字列が入力されるのであれば、書式指定の方も、それに合わせて “%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
Hello World

区切られた2つの文字列が読み込まれる

ファイルから入力する場合も全く同じことになります。予め”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”を指定します。

Hello World

ちゃんと2つの文字列が読み込まれた

“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

#C言語 #プログラミング講座 #入力 #scanf #fscanf #書式指定  

この記事が気に入ったらサポートをしてみませんか?