【C言語】
fopen関数の基本的な使い分と
ファイルポインタ(stdin,stdout)

fopen関数とファイルポインタの基本

■単純な画面出力

#include <stdio.h>
int main(void){
    printf("ハローワールド\n");
}

単純な画面出力(=標準出力)

■標準出力stdoutを強調

#include <stdio.h>
int main(void){
    fprintf(stdout,"ハローワールド\n");
}

printfとfprintf(stdout,は全く同じ動作をします。

■FILE *を使用したstdout

#include <stdio.h>
int main(void){
    FILE    *fp = stdout;
    fprintf(fp,"ハローワールド\n");
}

stdout,stderr,stdinもファイルの一種です。

■普通のファイルへの書き込み

#include <stdio.h>
int main(void){
    FILE *fp = fopen("write.txt","w");
    if(fp == NULL){
        perror(NULL);
        return -1;
    }
    fprintf(fp,"ハローワールド\n");    
    fclose(fp);    
}

普通のファイル ”write.txt”に”ハローワールド”を書き込む例。

標準入力、標準出力、標準エラー(stdin,stdout,stderr)とは異なり、
普通のファイルは
プログラマが自分でファイルをfopen()/fclose()する必要があります。

■単純なキーボード入力

#include <stdio.h>
int main(void){
    char buf[BUFSIZ];
    printf("何か文字列を入力してね\n");
    gets(buf);
    printf("%s が入力されました",buf);
}

キーボード(標準入力)から1行読み込み、
オーム返しするプログラムです。

※標準入力から1行読み込む gets 関数は廃れたので、
実務では使わないで下さい。

■標準入力stdinを強調

#include <stdio.h>
#include <stdlib.h>
int main(void){
    char buf[BUFSIZ];
    fprintf(stdout,"何か文字列を入力してね\n");
    fgets(buf,BUFSIZ,stdin);
    fprintf(stdout,"%s が入力されました",buf);
}

標準入力(stdin)ファイルから1行読み込みます。

■FILE *を使用したstdin

#include <stdio.h>
#include <stdlib.h>
int main(void){
    char buf[BUFSIZ];
    FILE    *fout = stdout;
    fprintf(fout,"何か文字列を入力してね\n");
    
    FILE    *fin = stdin ;
    fgets(buf,BUFSIZ,fin);
    fprintf(fout,"%s が入力されました",buf);
}

標準入力(stdin)ファイルから1行読み込みます。

■ファイルから1行読み込み1行書き込む

#include <stdio.h>
#include <stdlib.h>
int main(void){
    char    buf[BUFSIZ];
    //読み込み  "r"
    FILE    *fin = fopen("/usr/include/stdio.h","r");
    if(fin == NULL){
        perror(NULL);
        exit(-1);
    }
    fgets(buf,BUFSIZ,fin);
    fclose(fin);

    //書き込み  "w"
    FILE    *fout = fopen("log.txt","w");
    if(fout == NULL){
        perror(NULL);
        exit(-1);
    }
    fputs(buf,fout) ;
    fclose(fout);
}

stdio.hファイルから1行読み込み、
log.txtファイルに1行書き込みます。

■簡単なファイルのコピー

#include <stdio.h>
#include <stdlib.h>
int main(void){
    //読み込み  "r"
    FILE    *fin = fopen("/usr/include/stdio.h","r");
    if(fin == NULL){
        perror(NULL);
        exit(-1);
    }
    //書き込み  "w" 
    FILE    *fout = fopen("log.txt","w");
    if(fout == NULL){
        perror(NULL);
        exit(-1);
    }
    //コピー
    char    buf[BUFSIZ];
    while(fgets(buf,BUFSIZ,fin) != NULL){
        fputs(buf,fout) ;
    }
    //掃除  
    fclose(fin);
    fclose(fout);
}

stdio.hファイルを
log.txtファイルにコピーします。