FrontPage

ファイルの入出力

基本事項
ファイルポインタを使ってエラー処理を行う。
while文を使って1行ずつ内容の読み書きを行う。

#include <stdio.h>
#include <stdlib.h>                                  /* exitを使用する      */
#include <string.h>                                  /* strlenを使用する    */

#define MAX_NAME 62
#define MAX_STR 256

int main(void)
{
    FILE *fin;
    char original[MAX_NAME];
    char str[MAX_STR];
    
    printf("input file name you want to copy > ");
    fgets(original, MAX_NAME, stdin);
    original[strlen(original) - 1] = '\0';           /* 改行コードの処理    */
    
    fin = fopen(original, "r");
    if(fin == NULL)
    {
        printf("can't open.\n");
        exit(1);
    }
    
    while(fgets(str, MAX_STR, fin) != NULL)
    {
        printf("%s", str);
    }
    
    return 0;
}

上書き確認についての注意

同じ名前のファイルがすでに存在する場合、本当に上書きしてもよいか確認するメッセージを表示させたい場合があります。
もっとも簡単な方法は、ファイルを読込みモード(rまたは+r)で開いてみて、読込みに失敗する場合にはファイルが存在しないと判断してしまう方法です。
しかし、読込み失敗にはさまざまな原因があり、この方法では少し不安な部分があります。
例えば、読込みパーミッションがないのに書込みパーミッションはあるというテキストファイルは、知らぬ間にファイルの内容が書換えられてしまうことになります。

より安全な確認方法がいくつか考えられますが、その一つとしてstatを使うものを紹介してみます。

#include <stdio.h>
#include <sys/stat.h>           /* stat構造体のデータ型宣言     */
int main(void)
{
    struct stat st;
    if(stat(ファイル名, &st) == -1)
    {
        printf("ファイルは存在しません。\n");
    }
    return 0;
}

stat関数はstat構造体に引数ファイルの情報を格納しようとします。
情報の取得に失敗した場合は-1が返るので、それを利用してファイルが存在するかどうかの判断を行います。
fopenより信頼性は高まりそうですが、この方法であっても、ファイルの存在する場所以前にアクセス権限のないディレクトリがひとつでも存在すると
ファイルの情報が取得できず-1が返ってきてしまうという点に注意が必要です。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:12 (3831d)