我希望用户为我提供文件存在的完整路径,而不仅仅是文件名。如何以这种方式打开文件?
是这样的:
ifstream file;
file.open("C:/Demo.txt", ios::in);
这似乎不起作用。
答案 0 :(得分:17)
通常,在Windows中使用反斜杠字符作为路径分隔符。所以:
ifstream file;
file.open("C:\\Demo.txt", ios::in);
请记住,在使用C ++源代码编写时,必须使用双反斜杠,因为反斜杠字符本身意味着双引号字符串中的特殊内容。所以上面引用了文件C:\Demo.txt
。
答案 1 :(得分:10)
您可以使用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;
}
}
此代码在您的系统上产生了什么?
答案 2 :(得分:2)
代码似乎对我有用。我认为与@Iothar一样。
检查是否包含所需的标题,以进行编译。如果它已编译,请检查是否有这样的文件,所有内容,名称等匹配,并检查您是否有权阅读该文件。
要进行交叉检查,请检查是否可以使用fopen打开它。
FILE *f = fopen("C:/Demo.txt", "r");
if (f)
printf("fopen success\n");
答案 3 :(得分:1)
对于那些动态地获取路径的人......例如的拖放安培;降:强>
一些主要结构使用双引号来拖放文件,如:
"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。
工作小提琴: http://ideone.com/XOROjq
答案 4 :(得分:0)
对此问题有不同的看法,可能会对某人有所帮助
我之所以来到这里是因为我正在Windows上的Visual Studio中进行调试,因此对/
与\\
的所有讨论都感到困惑(在大多数情况下,这并不重要)。
对我来说,问题是:“当前目录”未设置为Visual Studio中所需的设置。它默认为可执行文件的目录(取决于您如何设置项目)。
通过以下方式进行更改:右键单击解决方案->属性->工作目录
我之所以只提及它,是因为问题似乎以Windows为中心,这通常也意味着以VisualStudio为中心,这告诉我这个提示可能是相关的(: