ファイルが開かない理由を誰かが知っていますか?また、「infile.txt」をプログラムのフォルダーとデバッグフォルダーに配置しようとしましたが、オープンエラーをチェックする方法の両方がトリガーされ、開くことができませんでした。場所をハードコーディングできることは知っていますが、したくありません。
stringobj.c_str()
を実行する必要があると聞きましたが、それが正しいかどうかわかりませんか?
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
ifstream infile;
ofstream outfile;
string fileloc = "infile.txt";
infile.open(fileloc);
if (!infile)
{
cout << "open fail 1" << endl;
}
bool fail = infile.fail();
if (fail)
{
cout << "open fail 2";
}
return 0;
}
ディレクトリ構造(少なくともVS2013の場合)は次のとおりです。
<base>
- Solution Directory
- Debug
- Release
- Project Directory
- Debug
- Release
プログラムはデフォルトでプロジェクトディレクトリで実行されます(ソリューション/デバッグディレクトリにビルドされている場合でも)。
プロジェクトの開始時にデフォルトの命名規則を受け入れた場合は、ファイルを「Projects\ConsoleApplication1」ではなく「Projects\ConsoleApplication1\ConsoleApplication1」ディレクトリに配置する必要があります。
まず、の署名のドキュメント
std::ifstream::open( const char * filename, ios_base::openmode mode=ios_base::in)
const char *が必要であることを示しています。これは、std :: string :: c_str()が提供するものとまったく同じです。ただし、const str&を受け入れるopenにはオーバーロードがあります。これは、ほとんどの実装で両方で同じように機能することを意味します。
それ以外の場合、取り組んでいるものは現在の作業ディレクトリ(またはcwd)として知られています。どうやらあなたはそのディレクトリがどこにあるのかわからない。 Visual Studioでデバッガーを実行しているときと、コマンドラインからプログラムを実行しているときとでは異なる場合があり、さまざまなIDEで異なる場合があります。
プログラムが現在のディレクトリで名前だけでファイルを開き、フルパスを指定しないようにする理由がわかりませんが...
現在の作業ディレクトリが何であるかを調べて、これをどこで試しても謎を解くことができます。私のVisualStudio 2015では、ディレクトリは最終的にデバッグの上のディレクトリになりますが、それはプロジェクトの構成方法に完全に依存しており、ここではそれを確認できません。
だから、試してみてください:
std::string cwd = getcwd( NULL, 0 );
これにはヘッダーが必要です<direct.h>
Visual StudioのWindowsの場合、ただし、把握しようとしているディレクトリが表示されます。
[プロジェクト設定]-> [デバッグ]で作業ディレクトリを確認します。そこでファイルを利用できるようにします。
と
string fileloc = "infile.txt";
infile.txtをcppファイルの同じフォルダーに置くと、問題ないはずです。
ところで私はあなたの最初の行を削除します
#include "stdafx.h"
私はcygwinコンソールを使用していますが、多少の違いがあるかもしれません