ユーザーに、ファイル名だけでなく、ファイルが存在する場所のフルパスを教えてほしい。この方法でファイルを開くにはどうすればよいですか?
次のようなものですか:
ifstream file;
file.open("C:/Demo.txt", ios::in);
これはうまくいかないようです。
通常、Windowsではパスセパレーターとしてバックスラッシュ文字を使用します。そう:
ifstream file;
file.open("C:\\Demo.txt", ios::in);
バックスラッシュ文字自体は二重引用符で囲まれた文字列内の特別なものを意味するため、C++ソースコードで記述されている場合は、二重バックスラッシュを使用する必要があることに注意してください。したがって、上記はファイルC:\Demo.txt
。
Fstreamクラスで完全なパスを使用できます。次のコードは、C:ドライブのルートにあるファイルdemo.txtを開こうとします。これは入力操作であるため、ファイルはすでに存在している必要があります。
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ifstream ifs( "c:/demo.txt" ); // note no mode needed
if ( ! ifs.is_open() ) {
cout <<" Failed to open" << endl;
}
else {
cout <<"Opened OK" << endl;
}
}
このコードはシステムで何を生成しますか?
コードは私には機能しているようです。 @Iotharでも同じだと思います。
コンパイルするために必要なヘッダーが含まれているかどうかを確認します。コンパイルされている場合は、そのようなファイルがあるかどうか、すべて、名前などが一致するかどうかを確認し、ファイルを読み取る権利があるかどうかも確認します。
クロスチェックを行うには、fopenで開くことができるかどうかを確認します。
FILE *f = fopen("C:/Demo.txt", "r");
if (f)
printf("fopen success\n");
動的にパスを取得している人のために...例えばドラッグ&ドロップ:
いくつかの主要な構造は、次のような二重引用符でファイルをドラッグ&ドロップします。
"C:\MyPath\MyFile.txt"
すばやく素敵な解決策は、この関数を使用して文字列から文字を削除することです。
void removeCharsFromString( string &str, char* charsToRemove ) {
for ( unsigned int i = 0; i < strlen(charsToRemove); ++i ) {
str.erase( remove(str.begin(), str.end(), charsToRemove[i]), str.end() );
}
}
string myAbsolutepath; //fill with your absolute path
removeCharsFromString( myAbsolutepath, "\"" );
myAbsolutepath
にはC:\MyPath\MyFile.txt
のみが含まれるようになりました
この関数には次のライブラリが必要です:<iostream>
<algorithm>
<cstring>
。
この関数は this answer に基づいていました。
Working Fiddle:http://ideone.com/XOROjq