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;
}

Read more