ショッピングモール  


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


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

No.3021

ディレクトリ配下のファイルを読み込む
投稿者---カズヲ(2004/11/22 22:34:52)


このプログラムを置いたディレクトリ内にあるディレクトリ内の
ファイルを読み込んで、内容を表示するというプログラムを作成して
いるのですが、fopenのところでfpの値がNULLになってしまいます。
よってファイル名が渡されているのにファイルを開くことができません。
どなたかアドバイスよろしくお願いします。

#include <stdio.h>
#include <ctype.h>
#include <dirent.h>
#include <stdlib.h>

void getFILE(char *f_name);

char file_buffer[1000][256];

void main(int argc, char *argv[])
{
    DIR *dir;
    char fld_name[256];
    struct dirent *dp;
    
    memset(fld_name, 0x00, sizeof(fld_name));
    
    if(argc != 2)
    {
        exit(1);
    }
    
    strcpy(fld_name, argv[1]);
    
    if((dir=opendir(fld_name)) == NULL)
    {
        printf("\nディレクトリ [%s] が開けません",fld_name);
        exit(-1);
    }

    for(dp=readdir(dir);dp!=NULL;dp=readdir(dir))
    {
        if(dp->d_name[0] != '.')
        {
            printf("ファイル名1:%s\n",dp->d_name);
            getFILE(dp->d_name);
        }
    }
    /* ディレクトリを閉じる   */
    closedir(dir);
    
}

void getFILE(char *f_name)
{
    int i, j;
    char *get_p;
    int cnt;

    FILE *fp;

    
    printf("%s\n", f_name);
    
    fp = fopen(f_name, "r");
    
    printf("%s\n", fp);
    printf("%s\n", f_name);
    
    if(fp == NULL)
    {
        printf("ファイル %s が開けません\n", f_name);
        exit(1);
    }
    
    cnt = 0;

    while(1)
    {
        
        get_p = fgets(file_buffer[cnt], 256, fp);
        
        if(get_p == NULL)
        {
            fclose(fp);
            break;
        }
        
        cnt++;
    }

    for(j = 0; j <cnt; j++)
    {
        printf("%s\n", file_buffer[j]);
    }
}
    
    




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ディレクトリ配下のファイルを読み込む 3022 RiSK 2004/11/22 23:14:55


No.3022

Re:ディレクトリ配下のファイルを読み込む
投稿者---RiSK(2004/11/22 23:14:55)


RiSK です。直接の回答ではないですが細かい指摘などをば。

インクルードしている <dirent.h> って何でしょうか?
DIR, struct dirent, opendir(), readdir(), closedir() 等は
dirent.h で定義されているのでしょうか?

ここらへんは処理系依存だと思います。環境を教えてください。


> void main(int argc, char *argv[])

int main(int argc, char *argv[])
にして最後に return 0; するとポータブル。


あと,memset(), strcpy() を使うなら <string.h> をインクルードした方がよいと思います。
ってか

    char fld_name[256];
    memset(fld_name, 0x00, sizeof(fld_name));

は

    char fld_name[256] = {0};

で十分ですよ。


    while(1)

はコンパイラによっては警告がでます。
VCTK2003 警告レベル4 では

> 3021.c(82) : warning C4127: 条件式が定数です。

ってなりました。

    for(;;)

だと黙ってくれます。
てか,cnt を最後にインクリメントしているならば

    for (cnt = 0; ; ++cnt)
    {
        get_p = fgets(file_buffer[cnt], 256, fp);
        if (get_p == NULL) {
            fclose(fp);
            break;
        }
    }

とした方がスッキリすると思いませんか?



この投稿にコメントする

削除パスワード

No.3023

Re:ディレクトリ配下のファイルを読み込む
投稿者---カズヲ(2004/11/22 23:34:58)


<pre>
>ここらへんは処理系依存だと思います。環境を教えてください。
コンパイラは、無償のBorland C++ Compiler 5.5(BCC)
を使用しています。


>インクルードしている <dirent.h> って何でしょうか?
>DIR, struct dirent, opendir(), readdir(), closedir() 等は
>dirent.h で定義されているのでしょうか?
上記のコンパイラの「dirent.h」 で定義されています。


> 3021.c(82) : warning C4127: 条件式が定数です。
上記のコンパイラでは大丈夫でした。
しかし、どの環境でも使用できるようにご指摘のように
訂正させていただきます。


</pre>



この投稿にコメントする

削除パスワード

No.3026

Re:ディレクトリ配下のファイルを読み込む
投稿者---RiSK(2004/11/23 00:14:40)


> コンパイラは、無償のBorland C++ Compiler 5.5(BCC)
>を使用しています。

ってことは Windows なのかな?

>しかし、どの環境でも使用できるようにご指摘のように

いやいや,使用はできますよ。「警告」ですから
# 文法「エラー」ではない

>上記のコンパイラの「dirent.h」 で定義されています。

了解。しかし,手元にそのヘッダはなさげなので,
それ以外についてさらに気づいた点を。

   char fld_name[256];

は不要なオブジェクトだと思います。argv[1] をそのまま使えると思います。

よって,fld_name が使っていた memset, strcpy も不要になります。
よって,<string.h> をインクルードする必要も無しになります。
# スッキリ!!

argv[1] を直接使うのがいやであれば

    const char *fld_name = argv[1];

とかやればいいと思います。


getFILE について。
ファイルの内容を表示したいのだろうと推測して,ちょこっと書いてみました。

/* ファイルの内容を標準出力に送る
 *
 * f_name 内容を表示するファイル名
 * 返却値 失敗時 0, 成功時 非0
 */
int getFILE(const char *f_name)
{
    FILE *fp;
    int c;

    printf("%s\n", f_name);
    if ((fp = fopen(f_name, "r")) == NULL) {
        printf("ファイル [%s] を開けません\n", f_name);
        return 0;
    }
    printf("%p\n%s\n", (void*)fp, f_name);

    while ((c = fgetc(fp)) != EOF && putchar(c) != EOF)
        ;
    fclose(fp);

    return 1;
}
char file_buffer[1000][256];
は使わないので削除してかまいません。


もともとの printf("%s\n", fp); について
    
ポインタを表示するときは %p
また void へのポインタで無ければならないようなので(void*)でキャストします。
# ホントに必要なのだろうか…



この投稿にコメントする

削除パスワード

No.3028

Re:ディレクトリ配下のファイルを読み込む
投稿者---RAPT(2004/11/23 00:53:40)


C言語の場合、(void *)で受ける場合、キャストは不要ですが、
C++言語の場合必要となります。
はたして、Cか、C++か・・


この投稿にコメントする

削除パスワード

No.3024

Re:ディレクトリ配下のファイルを読み込む
投稿者---RAPT(2004/11/22 23:40:42)


fopen()でNULLが返る、すなわち、「ファイルが見つからない」ですね。
あなたがいくら「ある」って宣言しても、プログラム的には「見つからない」
のです。

例えば、VC++6開発環境では、実行ファイルは、DEBUG時、DEBUGフォルダ
に作成されますが、カレントディレクトリはその上のフォルダになります。
e.g.
C:\Project\MyProject にあったときに、
C:\Project\MyProject\Debug に MyProject.exe とかあって、
FILE * fp = fopen("datafile.txt", "r");
としたときに、
C:\Project\MyProject\Debug\datafile.txt ではなく、
C:\Project\MyProject\datafile.txt を開こうとします。



この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity