2012-04-23 107 views
0

我想在C++中打开一个文件。打开文件C++错误

我的文件位于/home/me/myproject/mydir/myfile.txt

我在该文件存在,并且不为空,我的文件系统检查。

我GETCWD(),我在/ home/ME/myproject的是检查/

因此,我试图打开它:

string myfilename; 
ifstream myfile; 
myfilename = "./mydir∕myfile.txt"; 
myfile.open(myfilename.c_str(), ios::in); 
if (myfile.fail()) { 
    // I always end up here. 
} 

我真的不明白为什么myfile.fail ()总是返回true。任何想法为什么它,或者我可以执行什么调试测试来理解为什么它的行为如此?


我发现有什么不对,谢谢大家。我使用的远程控制软件显然认为“/”(正斜杠)不同于“/”(分割字符)。尽管我仍然有一个问题困扰着我,但我会在另一篇文章中提问。 errno和strerror()帮助我理解错误。这些错误很难找到,对不起,它与C++代码没有严格的关系。

(注:我在这里回答,因为显然我不能回答我自己的问题)。

+1

尝试使用绝对路径'/ home/me/myproject/mydir/myfile.txt'来打开文件。 – Isaac 2012-04-23 11:50:36

+0

我认为这可行,但一定要检查您正在运行的进程已读取该文件的文件系统权限。 http://en.wikipedia.org/wiki/Filesystem_permissions#Traditional_Unix_permissions – HostileFork 2012-04-23 11:52:20

+6

当操作失败时,打印出'errno'的值,或者['strerror'](http://linux.die.net/man/ 3/strerror)得到一个可读的字符串。 – 2012-04-23 11:53:11

回答

0

当您使用相对路径打开文件时,它是从执行目录计算的,这取决于您如何启动程序。

假设你的程序位于~/path/to/my/program,如果你当前的目录是〜当你启动它时(因此你的命令是./path/to/my/program/my_program),执行目录是〜。如果您的当前目录是〜/ path/to/my(并且您使用./program/my_program命令启动),则执行目录是〜/ path/to/my。您可以使用getcwd()函数来确定当前的工作目录。

为了避免这样的问题,一个好的经验法则是在应用程序中始终使用绝对路径。

此外,您应该在if (myfile.fail()) {...}块中使用errnostrerror以获取有关该错误的更多信息。

+0

-1,虽然在技术上是正确的:他明确声明他使用'getcwd()'来检查路径。 – KillianDS 2012-04-23 12:32:14

+0

我同意并走得更远 - 大多数可执行文件和脚本(专门用于处理用户当前目录的命令行工具除外)的第一个操作应该是将工作目录更改为可执行文件的位置,并且永远不要使用一个相对路径。 – Ben 2012-04-23 12:38:16

+0

我对此有一个问题,但我会在另一篇文章中提出。 – bob 2012-04-23 12:58:11