VC++のストリームによるディスクファイル入出力について – プログラミング – Home

VC++のストリームによるディスクファ...
 
通知
すべてクリア

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


mua
 mua
(@mua)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

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


引用未解決
トピックタグ
mua
 mua
(@mua)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

Win2000 VC6.0SP2 MFC
<対象:VC++ラウンジ>

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> 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
 mua
(@mua)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

#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
 mua
(@mua)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

ありがとうございます。
ファイルのパス指定ができなかった原因がわかりました。
変数にパスが入ってなかったためです。
単純なミスでごめんなさい。

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

char ssa[MAX_PATH];

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

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

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

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

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


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

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

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

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

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


返信引用
mua
 mua
(@mua)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

毎回毎回説明不足でどうもすみません。
クラス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
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

こんばんは、RAPTです。

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

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

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

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

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


返信引用
mua
 mua
(@mua)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

> # 質問内容が変わったのなら、新スレッドで質問すべきと考えますが。。
RAPTさんのご指摘の通りだと思いました。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました