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

Posted

技术标签:

【中文标题】在 C++ 中按完整路径打开文件【英文标题】:Open file by its full path in C++ 【发布时间】:2010-10-24 23:48:51 【问题描述】:

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

是这样的吗:

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

这似乎不起作用。

【问题讨论】:

你怎么知道它不起作用?它当然应该这样做。 @DanielEarwicker 你错了,这是对的。如果你想转换它,你应该把它转换成 \\ 而不是 \ 【参考方案1】:

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

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

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

【讨论】:

我知道的所有 Windows 编译器都支持在文件名中使用正斜杠,为了便于移植,应该优先使用它而不是反斜杠。 Win32 支持“\”或“/”作为路径,除非您绕过路径规范化(路径以“\\?\”开头)。见msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx 尼尔,这与编译器无关。 windows shell 以与反斜杠相同的方式处理正斜杠。自新台币早期以来就是这种情况。 windows shell(如果你的意思是 cmd.exe)与这里无关。 它甚至与 shell 没有任何关系,它取决于内核(Richard 说得对)。我说“通常”是因为在使用正斜杠时仍然会遇到问题,因为某些程序将以正斜杠开头的参数解释为命令行选项而不是文件名。您是正确的,仅打开文件,正斜杠或反斜杠都可以。约定更喜欢反斜杠。【参考方案2】:

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

这段代码在您的系统上产生了什么?

【讨论】:

【参考方案3】:

代码似乎对我有用。 @Iothar 我也这么认为。

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

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

FILE *f = fopen("C:/Demo.txt", "r");
if (f)
  printf("fopen success\n");

【讨论】:

【参考方案4】:

对于那些动态获取路径的人......例如拖放:

一些主要结构使用双引号拖放文件,例如:

"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

函数需要这些库:&lt;iostream&gt;&lt;algorithm&gt;&lt;cstring&gt;。 函数基于this answer。

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

【讨论】:

【参考方案5】:

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

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

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

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

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

【讨论】:

以上是关于在 C++ 中按完整路径打开文件的主要内容,如果未能解决你的问题,请参考以下文章

IPython Notebook 打开文件对话框(检索完整路径)

如何查找Excel文件所在的完整路径

如何查找Excel文件所在的完整路径

如何在c ++中的可执行文件附近的文件夹中打开图像

如何在 C# 中按进程获取打开文件句柄的列表?

如何将单击的文件完整路径传递给设置为默认程序以打开某些特定文件类型的批处理命令快捷方式