掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24629

ファイルの存在チェックについて
投稿者---べた(2005/12/09 09:29:55)


ディレクトリに"001"から始まるファイルが存在しているか
存在チェックを行い、存在していない場合は、"001"が付いて
いるファイルをオープンする。
存在した場合は、存在するファイルの番号が一番大きい次の
番号をファイルに付与してファイルをオープンする。

例えば
「xxxx_001.csv」がなければ、xxxx_001.csvをオープン。
例えば
「xxxx_005.csv」までが存在していたら、xxxx_006.csvをオープン。

まずは、どのようにすればよいのですか。
どのような関数を使って、ファイルの存在チェックを行えばよい
のですか。
ファイルの数と、ファイルに付与する番号は、基本的には、同じになる
と思うのですが、ファイル数も取得したいのですが、関数等あるの
でしょうか。

環境
Solaris8
UNIX-C
gcc



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルの存在チェックについて 24632 たいちう 2005/12/09 09:57:51
<子記事> Re:ファイルの存在チェックについて 24796 かずま 2005/12/14 02:47:23


No.24632

Re:ファイルの存在チェックについて
投稿者---たいちう(2005/12/09 09:57:51)


こっちだけ回答。

> どのような関数を使って、ファイルの存在チェックを行えばよい
> のですか。

http://www.kouno.jp/home/c_faq/c19.html#0


この投稿にコメントする

削除パスワード

No.24644

Re:ファイルの存在チェックについて
投稿者---べた(2005/12/10 13:07:22)


fopen、stat関数を使って考えてみます。

でも、fopenで判断すると、本当にファイルが存在しないのか、
ファイルのオープンエラーで失敗しているのか判断ができない
可能性がありませんか。



この投稿にコメントする

削除パスワード

No.24646

Re:ファイルの存在チェックについて
投稿者---RiSK(2005/12/10 13:43:01)


# Solaris8 は分かりませんが。

>でも、fopenで判断すると、本当にファイルが存在しないのか、
>ファイルのオープンエラーで失敗しているのか判断ができない
>可能性がありませんか。

あります。
その違いを区別する必要はあるのでしょうか?


この投稿にコメントする

削除パスワード

No.24737

Re:ファイルの存在チェックについて
投稿者---べた(2005/12/12 14:59:53)


>その違いを区別する必要はあるのでしょうか?

すみません。
説明が足りなかったかもしれません。

ファイル名には、連番がついていいます。
連番の存在しないファイル、つまり存在する連番の一番大きい
番号の次のファイルを見つけオープンしようとしています。

fopenよりは、statの方がいいかも知れません。



この投稿にコメントする

削除パスワード

No.24789

Re:ファイルの存在チェックについて
投稿者---wiz(2005/12/14 01:01:44)


>>その違いを区別する必要はあるのでしょうか?

>ファイル名には、連番がついていいます。
>連番の存在しないファイル、つまり存在する連番の一番大きい
>番号の次のファイルを見つけオープンしようとしています。

区別する理由にならない気がするのですが。。。?

私はfopenでいいと思ってます。
読み込みモードでコールした場合、ファイルが存在しなければ
NULLを返します。エラー時でもNULLを返しますが
基本的にはオープンに失敗すればファイル操作はできないので、
読み込みモードでオープンに失敗したファイル名を使用して
書き込みモードでオープンすれば新しいファイルを作れますし
それでも失敗するようならエラーを返せばいいかと。。

#ファイル処理するのにオープンが失敗した場合は結局
#ファイル操作できないので。。。
#存在チェックのためだけにfopenを呼ぶのが嫌ならしかたないですが。

>ファイルの数と、ファイルに付与する番号は、基本的には、同じになる
>と思うのですが、

例えば、000_xxx.cvs、001_xxx.cvs,003_xxx.cvs,004_xxx.cvs
とかになる可能性はないのですか?

#この場合は002を作成するべき?
#とかその辺りの仕様も決めておいたほうがいいと思います。

>ファイル数も取得したいのですが、関数等あるの
>でしょうか。

fopenを使用してファイルの存在チェックをかけるときに、
開けたファイルの数をカウントすればいいのでは?

#あくまでもfopen出の話ですが。。。


この投稿にコメントする

削除パスワード

No.24796

Re:ファイルの存在チェックについて
投稿者---かずま(2005/12/14 02:47:23)


参考になりますか?
#include <stdio.h>
#include <dirent.h>

int next_no(void)
{
    int i, no = 0;
    char c;
    DIR *dp;
    struct dirent *ep;

    dp = opendir(".");
    if (!dp) return 0;
    while (ep = readdir(dp))
        if (sscanf(ep->d_name, "xxx_%d.csv%c", &i, &c) == 1 && i > no)
            no = i;
    closedir(dp);
    return no;
}

int main(void)
{
    int n = next_no();
    if (n) printf("xxx_%03d.cvs", n+1);
    return 0;
}



この投稿にコメントする

削除パスワード

No.24798

Re:ファイルの存在チェックについて
投稿者---かずま(2005/12/14 10:17:52)


ファイルが存在しなかった場合の処理が間違っていました。訂正します。
#include <stdio.h>
#include <dirent.h>

int find_last(void)
{
    int i, n = 0;  char c;
    struct dirent *ep;
    DIR *dp = opendir(".");
    if (!dp) return -1;

    while (ep = readdir(dp))
        if (sscanf(ep->d_name, "xxx_%d.csv%c", &i, &c) == 1 && i > n)
            n = i;
    closedir(dp);
    return n;
}

int main(void)
{
    int n = find_last();
    if (n >= 0) printf("xxx_%03d.csv", n + 1);
    return 0;
}



この投稿にコメントする

削除パスワード

No.24800

Re:ファイルの存在チェックについて
投稿者---べた(2005/12/14 11:55:11)


かずまさん。
ありがとうございます。

大変、参考になります。

opendir、readdir関数があるとは知りませんでした。
opendir、readdir関数でファイル名、ディレクトリが取得できるとは。

ちなみに、ファイルかディレクトリとかの判断もできる関数とか
あるのでしょうか。


この投稿にコメントする

削除パスワード

No.24803

Re:ファイルの存在チェックについて
投稿者---Craft(2005/12/14 14:02:24)



>ちなみに、ファイルかディレクトリとかの判断もできる関数とか
>あるのでしょうか。

stat()関数を使うことでチェックできます。

test というファイルがディレクトリかファイルかチェックしている例。
(ファイルがない場合のエラー判定は省いています)

アクセス権や、ブロックデバイス、キャラクタデバイス等も判定できます。
詳しくはsys/stat.hを参照するか、検索してください。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    struct stat statbuf;

    stat("test",&statbuf);

    if( S_ISDIR(statbuf.st_mode) != 0 ){
        printf( "ディレクトリです\n" );
    }
    else if( S_ISREG(statbuf.st_mode) != 0 ){
        printf( "通常ファイルです\n" );
    }
    else{
        printf( "その他のファイルです\n" );
    }

    return 0;
}





この投稿にコメントする

削除パスワード

No.24804

Re:ファイルの存在チェックについて
投稿者---べた(2005/12/14 16:13:54)


Craftさん
ありがとうございます。

manコマンドで調べて見ます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧