我希望用户给我文件所在的完整路径,而不仅仅是文件名。如何以这种方式打开文件?
是这样的吗:
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>
.
该功能基于此答案。
工作小提琴:http: //ideone.com/XOROjq
对这个问题有不同的看法,这可能会对某人有所帮助:
我来到这里是因为我在 Windows 上的 Visual Studio 中进行调试,我对所有这些/
与\\
讨论感到困惑(在大多数情况下这真的无关紧要)。
对我来说,问题是:“当前目录”没有设置为我在 Visual Studio 中想要的。它默认为可执行文件的目录(取决于您如何设置项目)。
通过以下方式更改它:右键单击解决方案 -> 属性 -> 工作目录
我只提到它是因为这个问题似乎以 Windows 为中心,这通常也意味着以 VisualStudio 为中心,这告诉我这个提示可能是相关的(: