標準ライブラリの
ifstream
や
DXライブラリの
FileRead_open
を使って、あるテキストファイルを開こうとしているのですが、どうもエラー発生(戻り値がエラー)して
開けません。
環境は、 Visual Studio Express Edition 2008 です。
DXライブラリを使用しています。
問題となっているのは、このコードです。
int eventsFileHandle = FileRead_open(eventPath.c_str());
eventsPath は std::string で、 "stages/最新のステージ/events.txt" となっています。
この結果は、eventsFileHandle が 0 となります。
(ブレイクポイントを置いて確認しました。)
フォルダ構成は、
作業ディレクトリ
|-stages
| |-最新のステージ
| | |-events.txt
です。
ファイルがそのディレクトリにない、 ということはありません。(何度も確認しました。)
また、日本語のパスを使用するために
//日本語のファイルパスを使うために必要。
locale::global(locale("japanese"));
これを、起動時に呼んでいます。
また、以前 / の代わりに \ を使っているのを見たことがあるので、\ もためしましたが、ダメでした。
(そういえば、パス指定の時の / と \ の違いが分かりません…)
情報足りない場合は、伝えてくだされば順次追加します。
以上、よろしくお願いします。
ifstream や FileRead_open でファイルを開けない
Re:ifstream や FileRead_open でファイルを開けない
[color=#d0b0c0" face="monospace]
>ステージ/events.txt
[/color]
その events.txtですが別のツールで開いていませんか?
例えば Excelとか。
もし開いているようなら閉じてから試してください。
次にもし「作業ディレクトリ」というのが VisualStudioのプロジェクト設定の
作業ディレクトリのことならいいのですが、そうではなくフォルダ名なのでしたら、
VisualStudioのプロジェクト設定の作業ディレクトリとしてそのフォルダを指定して
みてください。
>ステージ/events.txt
[/color]
その events.txtですが別のツールで開いていませんか?
例えば Excelとか。
もし開いているようなら閉じてから試してください。
次にもし「作業ディレクトリ」というのが VisualStudioのプロジェクト設定の
作業ディレクトリのことならいいのですが、そうではなくフォルダ名なのでしたら、
VisualStudioのプロジェクト設定の作業ディレクトリとしてそのフォルダを指定して
みてください。
Re:ifstream や FileRead_open でファイルを開けない
>その events.txtですが別のツールで開いていませんか?
いいえ、開いていません。
> 次にもし「作業ディレクトリ」というのが VisualStudioのプロジェクト設定の
>作業ディレクトリのことならいいのですが、そうではなくフォルダ名なのでしたら、
>VisualStudioのプロジェクト設定の作業ディレクトリとしてそのフォルダを指定して
>みてください。
前者です。
プロジェクト設定で作業ディレクトリに指定したフォルダであって、フォルダ名ではありません。
(明記していなくてすいませんでした。)
*再起動して再挑戦してみましたが、直っていなかったので、間違って開いていることはなさそうです。
いいえ、開いていません。
> 次にもし「作業ディレクトリ」というのが VisualStudioのプロジェクト設定の
>作業ディレクトリのことならいいのですが、そうではなくフォルダ名なのでしたら、
>VisualStudioのプロジェクト設定の作業ディレクトリとしてそのフォルダを指定して
>みてください。
前者です。
プロジェクト設定で作業ディレクトリに指定したフォルダであって、フォルダ名ではありません。
(明記していなくてすいませんでした。)
*再起動して再挑戦してみましたが、直っていなかったので、間違って開いていることはなさそうです。
Re:ifstream や FileRead_open でファイルを開けない
1.Cドライブ直下にファイルを置いて絶対パスで試してみる
2.1で大丈夫だったら「最新ステージ」を半角にして試してみる
3.2がだめだったらファイルに変な属性が付いてる可能性を考慮して新規作成してテキストの中身をコピーして試す
4.OpenFile関数等でもハンドルが取得できないのか試す
後「\」の場合"stages\\最新のステージ\\events.txt"こんな感じになります。
\t(タブ)等の指定方法があるため、「\」は2個で「\」になります。
2.1で大丈夫だったら「最新ステージ」を半角にして試してみる
3.2がだめだったらファイルに変な属性が付いてる可能性を考慮して新規作成してテキストの中身をコピーして試す
4.OpenFile関数等でもハンドルが取得できないのか試す
後「\」の場合"stages\\最新のステージ\\events.txt"こんな感じになります。
\t(タブ)等の指定方法があるため、「\」は2個で「\」になります。
Re:ifstream や FileRead_open でファイルを開けない
>後「\」の場合"stages\\最新のステージ\\events.txt"こんな感じになります。
>\t(タブ)等の指定方法があるため、「\」は2個で「\」になります。
はい、\\ の使い方は知ってはいます。
ただ、\ を使おうが、 / を使おうが違いはなく、どちらでも良いのだろうか? という素朴な疑問でした。
int eventsFileHandle = FileRead_open("stages/最新のステージ/events.txt");
こうしたら、正常に動作しました。
const char* name = "stages/最新のステージ/events.txt";
int eventsFileHandle = FileRead_open(name);
これでも、正常に動作しました。
つまり、c_str() を使うとダメなのでしょう。
なぜでしょうか・・・。
*追記
const char* name = eventPath.c_str();
int eventsFileHandle = FileRead_open(name);
この方法だと、ダメでした・・・。なぜだぁ。
>\t(タブ)等の指定方法があるため、「\」は2個で「\」になります。
はい、\\ の使い方は知ってはいます。
ただ、\ を使おうが、 / を使おうが違いはなく、どちらでも良いのだろうか? という素朴な疑問でした。
int eventsFileHandle = FileRead_open("stages/最新のステージ/events.txt");
こうしたら、正常に動作しました。
const char* name = "stages/最新のステージ/events.txt";
int eventsFileHandle = FileRead_open(name);
これでも、正常に動作しました。
つまり、c_str() を使うとダメなのでしょう。
なぜでしょうか・・・。
*追記
const char* name = eventPath.c_str();
int eventsFileHandle = FileRead_open(name);
この方法だと、ダメでした・・・。なぜだぁ。
Re:ifstream や FileRead_open でファイルを開けない
const char* name = eventPath.c_str();
int eventsFileHandle = FileRead_open(name);
を実行したときの画像です。
*ブレイクポイントは、コード通過後にいれています。
*追記
char* name = new char[126];
strcpy_s(name,126,eventPath.c_str());
int eventsFileHandle = FileRead_open(name);
これでも、ダメでした・・・。
いまさらですが、「ねこ」さんが提示してくださった方法の返答を。
>1.Cドライブ直下にファイルを置いて絶対パスで試してみる
作業ディレクトリ直下で、引数に直接文字列を渡したらOKでした。
つまり、 ("events.txt") で開けました。
>2.1で大丈夫だったら「最新ステージ」を半角にして試してみる
"stages/最新のステージ/events.txt"
を直接渡したら、開けました。
>3.2がだめだったらファイルに変な属性が付いてる可能性を考慮して新規作成してテキストの中身をコピーして試す。
2 OKでした。
>4.OpenFile関数等でもハンドルが取得できないのか試す。
直接渡したら開けたので、やらなくてもいいかな。
(チェックの意図だとは思いますが、DXアーカイブを開けないといけません。)
int eventsFileHandle = FileRead_open(name);
を実行したときの画像です。
*ブレイクポイントは、コード通過後にいれています。
*追記
char* name = new char[126];
strcpy_s(name,126,eventPath.c_str());
int eventsFileHandle = FileRead_open(name);
これでも、ダメでした・・・。
いまさらですが、「ねこ」さんが提示してくださった方法の返答を。
>1.Cドライブ直下にファイルを置いて絶対パスで試してみる
作業ディレクトリ直下で、引数に直接文字列を渡したらOKでした。
つまり、 ("events.txt") で開けました。
>2.1で大丈夫だったら「最新ステージ」を半角にして試してみる
"stages/最新のステージ/events.txt"
を直接渡したら、開けました。
>3.2がだめだったらファイルに変な属性が付いてる可能性を考慮して新規作成してテキストの中身をコピーして試す。
2 OKでした。
>4.OpenFile関数等でもハンドルが取得できないのか試す。
直接渡したら開けたので、やらなくてもいいかな。
(チェックの意図だとは思いますが、DXアーカイブを開けないといけません。)
Re:ifstream や FileRead_open でファイルを開けない
>文字列のはじめに半角スペースが入っている気がするのですが、気のせいでしょうか?
Σなぬ!
そのとおりです・・・ね。。。
本当に、本当に、大変お騒がせしてすいませんでした。(恥ずかしい・・・)
m(_ _)m
Σなぬ!
そのとおりです・・・ね。。。
本当に、本当に、大変お騒がせしてすいませんでした。(恥ずかしい・・・)
m(_ _)m