20

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

是这样的吗:

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

这似乎不起作用。

4

5 回答 5

21

通常在 Windows 中使用反斜杠字符作为路径分隔符。所以:

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

请记住,当用 C++ 源代码编写时,您必须使用双反斜杠,因为反斜杠字符本身在双引号字符串中具有特殊含义。所以上面指的是文件C:\Demo.txt

于 2009-05-09T10:32:05.977 回答
12

您可以对 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;
   }
}

此代码在您的系统上产生什么?

于 2009-05-09T10:31:50.673 回答
2

该代码似乎对我有用。我认为@Iothar 也是如此。

检查您是否包含所需的标头以进行编译。如果已编译,请检查是否存在这样的文件,以及所有内容、名称等是否匹配,并检查您是否有权读取该文件。

要进行交叉检查,请检查是否可以使用 fopen..

FILE *f = fopen("C:/Demo.txt", "r");
if (f)
  printf("fopen success\n");
于 2011-02-17T14:31:39.060 回答
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>.
该功能基于此答案

工作小提琴:http: //ideone.com/XOROjq

于 2015-04-02T04:31:01.663 回答
0

对这个问题有不同的看法,这可能会对某人有所帮助:

我来到这里是因为我在 Windows 上的 Visual Studio 中进行调试,我对所有这些/\\讨论感到困惑(在大多数情况下这真的无关紧要)。

对我来说,问题是:“当前目录”没有设置为我在 Visual Studio 中想要的。它默认为可执行文件的目录(取决于您如何设置项目)。

通过以下方式更改它:右键单击解决方案 -> 属性 -> 工作目录

我只提到它是因为这个问题似乎以 Windows 为中心,这通常也意味着以 VisualStudio 为中心,这告诉我这个提示可能是相关的(:

于 2020-07-15T01:12:35.463 回答