在C ++中以完整路径打开文件

时间:2009-05-09 10:27:49

标签: c++ file path ifstream

我希望用户为我提供文件存在的完整路径,而不仅仅是文件名。如何以这种方式打开文件?

是这样的:

ifstream file;
file.open("C:/Demo.txt", ios::in);

这似乎不起作用。

5 个答案:

答案 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为中心,这告诉我这个提示可能是相关的(: