VC++のストリームによるディスクファイル入出力について

[戻る]
mua 2002/11/18(月) 18:45:21
ファイル処理でうまくできないところがあるのでお聞きしたいです。
ifstream fin("file.txt");
上記の記述の場合はfile.txtという名前のファイルが
カレントに作成されると思うのですが、
そのパスの指定をしたいのです。
そのパス指定をユーザにさせたいというところがどうしてもできません。
ifstream fin("../file.txt");
上記のようにダブルクォーテーションで囲まれた範囲にパスを指定すると、
大丈夫なのですが、ユーザに指定させたパスはCString変数のstrに格納されています。
ifstream fin(str);
strにはc:\が入っています。
上記のように記述するとうまくファイルが作成されません。
何かよい方法を教えていただきたいです。

mua 2002/11/18(月) 18:47:40
Win2000 VC6.0SP2 MFC
<対象:VC++ラウンジ>

開発環境を書き忘れてしまいました。
大変申し訳ございませんでした。

YuO [E-Mail] 2002/11/18(月) 19:27:01
> ifstream fin("file.txt");
> 上記の記述の場合はfile.txtという名前のファイルが
> カレントに作成されると思うのですが、

ifstream fin("file.txt");
は
ifstream fin("file.txt", ios_base::in);
に等しいです。これは
fopen("file.txt", "r");
を呼び出します。
で,存在しないファイルに対して"r"で開こうとするとfopenは失敗します。
結局,file.txtは作成されません。


> ifstream fin(str);
> strにはc:\が入っています。
> 上記のように記述するとうまくファイルが作成されません。

そりゃ,ディレクトリ開こうとしても……。せめて,
ifstream fin(str + "file.txt");
としないと……。

ちなみに,標準でないifstreamに関してはよく知りません。

mua 2002/11/18(月) 20:57:33
YuOさんありがとうございます。
しかし、どうもうまくいかないのですが、何がいけないのかよくわかりません。
次のように記述してみました。
ifstream fin1;
fin1.open(str);
strにはc:\file.txtが入っていて、c:\にはfile.txtというファイルがあります。
しかし、そのファイルにうまくアクセスできません。
fin1.open(?);
?の位置には変数は使えなかったりするのでしょうか。
どうすれば、変数に指定されたパスにあるファイルにアクセスできるのでしょうか。
何か別の方法があれば教えていただきたいです。

YuO [E-Mail] 2002/11/18(月) 21:45:51
#include <iostream>
#include <fstream>
using namespace std;

int main (void)
[
    char str[] = "C:\\file.txt";

    ifstream fin(str);
    if (fin) {
        cout << fin.rdbuf();
    }
    return 0;
}

上記のようなプログラムを作れば,C:\file.txtの内容が標準出力に出力されるはずですが。

> しかし、そのファイルにうまくアクセスできません。
とは,
a. ファイルを開く時点で開けない
b. ファイルから読み込む時点で読み込めない
c. ファイルから読み込めるが,読み込んだ値が正しくない
のどれ(またはその他?)ですか?
「うまくアクセスできない」というのは抽象的すぎてどういう状態なのかわかりませんよ。

mua 2002/11/19(火) 00:11:04
ありがとうございます。
ファイルのパス指定ができなかった原因がわかりました。
変数にパスが入ってなかったためです。
単純なミスでごめんなさい。

違うことを伺ってもよろしいでしょうか。
クラスqaqaのメンバ変数にpublicで、

char ssa[MAX_PATH];

と設定して別のクラスから使用することにしたのですが、

qaqa myDL;
fin1.open(myDL.ssa);

と記述していても今までは動きませんでした。(ssaにはパスが入っている)
ふと思い、次のような記述をしました。

qaqa myDL;
myDL.DoModal();
fin1.open(myDL.ssa);

と記述したらいきなり動きだしました。
いったい、何が変わったのでしょうか。
あと、ファイルにはうまくアクセスできたのですが、
ダイアログがファイルアクセスの度に開いてしまいます。
何かよい方法はありませんでしょうか。

アイススケーター 2002/11/19(火) 08:11:58
>qaqa myDL;
>fin1.open(myDL.ssa);

>と記述していても今までは動きませんでした。(ssaにはパスが入っている)
>ふと思い、次のような記述をしました。

上記の場合、ssaにパスを入れる場所がないと思いますが

qaqa myDL;
ここにssaにパスを入れる場所が必要でしょう。
fin1.open(myDL.ssa);

mua 2002/11/19(火) 23:08:52
毎回毎回説明不足でどうもすみません。
クラスqaqaのメンバ変数にpublicで、

char ssa[MAX_PATH];

と設定し、そのssaにパスを挿入したのです。
その後に、別のクラスから

qaqa myDL;
fin1.open(myDL.ssa);

という記述でssaに代入されているパスにアクセスしにいったのですが
アクセスされずに、文字化けのようにフフフフフフと表示されました。
myDL.ssaの中身を出力してみると、やはりパスは入っていませんでした。
しかし、

qaqa myDL;
myDL.DoModal();
fin1.open(myDL.ssa);

上記のように記述するして、myDL.ssaの中身を出力してみると、
パスが入っていました。
これはいったいどういうことなのでしょうか?
なぜmyDL.DoModal();と記述しなければ、パスがmyDL.ssaに入っていないのでしょうか。

RAPT 2002/11/20(水) 01:06:38
こんばんは、RAPTです。

# 質問内容が変わったのなら、新スレッドで質問すべきと考えますが。。

肝心の、qaqa クラスのインプリメントを記述してもらえないと、適切なアドバイスが
できないと思います。

特に興味があるのは、一体、どの時点で、ssa に値の代入を行なっているか、という
点です。

> ssaにはパスが入っている
というのは、デバッガでトレースした結果でしょうか。それとも「入っているはずだ」
という意味でしょうか。

Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0

mua 2002/11/20(水) 23:58:39
[[解決]]
> # 質問内容が変わったのなら、新スレッドで質問すべきと考えますが。。
RAPTさんのご指摘の通りだと思いました。

VC++のストリームによるディスクファイル入出力については解決いたしました。
ifstream fin1;
fin1.open(str);
という記述の場合でも、strにパスが入ってさえいれば、問題なく動くということです。

返信してくださった方々、どうもありがとうございました。

古いスレッドには追加発言できません。