I/O(C)
簡単な File I/O 紹介 (C版)
ここでは、C 言語を用いた簡単な入出力を紹介します。 といっても、コンテストに必要となりそうな主な例を紹介するだけですが。
標準出力 (printf)
標準出力に文字列を表示するには、printfを使えばよいでしょう。
簡単な例(printTest.c)を紹介しておきます。
文字列や int, float/double
を扱った例です。 データ型によって、%s %d %fなど表記が変わります。\nと言うのは、改行文字です
(ブラウザの種類によって"\\“は”\“や"¥"のように見えているかもしれませんが)。
プログラム後半部分は、浮動小数点に関する、やや細かい例です。format の詳細は、wikipediaの記事でもみてください。
まずは実行させてください。Eclipse を使っているなら、例えば、新しい HelloWorld を作成して、下記の文面を copy & paste すればOKです。
#include <stdio.h> /* 標準I/O library の宣言を取り込み */
int main(void) {
printf("Hello World¥n"); /* 文字列 */
printf("%d %f¥n", 10, 1.0); /* 整数、浮動小数 */
char name[] = "Taro"; /* 文字列 */
printf("Hello World, %s.¥n", name);
/* 浮動小数の込み入った例 */
printf("%f %.2f %e¥n", 10.1, 10.1, 10.1);
double v =(((1.0)/1000)/1000)/1000;
printf("%f %.2f %e¥n",v,v,v);
printf("%f %f¥n", 1.0/0.0, 0.0/0.0);
return 0;
}
標準入力
標準入力から、データを取り込むには、scanfを使うと楽でしょう。
以下が簡単なサンプル(scanTest.c)です。 long, double
などのフォーマットの変化に注意しましょう。
なお、一行読み込みに関しては、fgets()を使っています。
#include <stdio.h>
int main(void) {
/* int への読み込み */
int x;
scanf("%d", &x);
printf("Input: %d¥n", x);
/* 配列要素への読み込み */
int y[2];
scanf("%d %d", &y[0], &y[1]);
printf("Input: %d %d¥n", y[0], y[1]);
/* float の読み込み */
float v;
scanf("%f", &v);
printf("Input: %f¥n", v);
/* double の読み込み */
double v2;
scanf("%lf", &v2);
printf("Input: %f¥n", v2);
/* 単語の読み込み */
char str[101]; /* 問題仕様に合わせて、十分なサイズを確保すること*/
scanf("%s", str); /* 空白で区切られた文字の読み込み */
printf("Input: %s¥n", str);
/* 行の読み込み */
char line[101]; /* 問題仕様に合わせて、十分なサイズを確保すること*/
fgets(line, 101, stdin); /* 改行(or 100文字)まで読込み */
printf("Input: %s", line);/* line 最後は"改行","ヌル" */
fgets(line, 101, stdin); /* 改行(or 100文字)まで読込み */
printf("Input: %s", line);/* line 最後は"改行","ヌル" */
return 0;
}
例えば、以下のデータを食べさせてください。
1234567890
1 2
3
4
Who are you!
Who are you!
注意1: Eclipse で実行中は、入力は標準出力が表示されているコンソールから行ってください。
注意2: gets, scanf
は、バッファオーバフローの危険があるなど、一般には扱いに注意が必要です。コンテストの場合は、入力データサイズに制限があると思いますので、それにそってバッファサイズを決めてください。
一文字単位の入力処理
getchar()
という関数で、標準入力からの一文字ずつデータを取り込み可能です。行サイズに制限がないなど言う場合に、どうぞ。
ファイルからの取り込みの場合は、getc(FILE\*)
あるいは fgetc(FILE\*)
を使うと良いでしょう。この関数は、ファイルの終わりはが来た場合は、EOF
が返り値となります。
fscanf("%c", &c)
で読み込んでも構いません。ファイルの終わりは、fscanf()
の返り値が EOF
となります。
以降は、ファイル入出力に取り組みたい人だけ見てくれればOKです。
ファイル出力 (fprintf)
fopen
によって、ファイルオープンし、書き込みを行います。**“w”**は、書き出しモードの指定です。printf
の代わりに、 fprintf
を使うことになります。こんな感じ(printTest2.c)。
#include <stdio.h> /* 標準I/O library の宣言を取り込み */
int main(void) {
char filename[] = "output.txt";
FILE *fpout = fopen(filename, "w");
if(fpout == NULL) {
fprintf(stderr, "Can not open file¥n");
return 1;
}
fprintf(fpout, "Hello World¥n"); /* 文字列 */
fprintf(fpout, "%d %f¥n", 10, 1.0); /* 整数、浮動小数 */
char name[] = "Taro"; /* 文字列 */
fprintf(fpout, "Hello World, %s.¥n", name);
/* 浮動小数の込み入った例 */
fprintf(fpout, "%f %.2f %e¥n", 10.1, 10.1, 10.1);
double v =(((1.0)/1000)/1000)/1000;
fprintf(fpout, "%f %.2f %e¥n",v,v,v);
fprintf(fpout, "%f %f¥n", 1.0/0.0, 0.0/0.0);
return 0;
}
ちなみに、printf(..)
と fprintf(stdout, ...)
は等価です。
ファイル入力 (fscanf)
fopen
によって、ファイルオープンし、書き込みを行います。**“r”**は、読み込みモードの指定です。scanf
の代わりに、 fscanf
を使うことになります。こんな感じ(scanTest2.c)。
ちなみに、gets(char\* buf)
の代わりに fgets(char\* buf, int bufsize,FILE\* fp)
を用いることに なります。なお、fgets
と違って改行文字が残るので、注意してください。
#include <stdio.h>
int main(void) {
char filename[] = "scanTest.txt";
FILE *fpin = fopen(filename, "r");
if(fpin==NULL) {
fprintf(stderr, "Can not open file¥n");
return 1;
}
/* int への読み込み */
int x;
fscanf(fpin, "%d", &x);
printf("Input: %d¥n", x);
/* 配列要素への読み込み */
int y[2];
fscanf(fpin, "%d %d", &y[0], &y[1]);
printf("Input: %d %d¥n", y[0], y[1]);
/* float の読み込み */
float v;
fscanf(fpin, "%f", &v);
printf("Input: %f¥n", v);
/* double の読み込み */
double v2;
fscanf(fpin, "%lf", &v2);
printf("Input: %f¥n", v2);
/* 単語の読み込み */
char str[101]; /* 問題仕様に合わせて十分なサイズを確保すること */
fscanf(fpin, "%s", str); /* 空白で区切られた文字の読み込み */
printf("Input: %s¥n", str);
/* 行の読み込み */
char line[101]; /* 問題仕様に合わせて十分なサイズを確保すること*/
fgets(line, 101, fpin); /* 改行(or 100文字)まで読込み */
printf("Input: %s", line);/* line 最後は"改行","ヌル" */
fgets(line, 101, fpin); /* 改行(or 100文字)まで読込み */
printf("Input: %s", line);/* line 最後は"改行","ヌル" */
return 0;
}