linux中,使用fopen函数打开文件失败

在linux环境下,编写了一个使用fopen打开文件的程序,需要在命令行下输入 路径 和 文件名 参数。
运行后,能够找到文件(openfile的可执行文件与被找的文件不在同一路径下),但是打开失败。
如果 将可执行文件与要找的文件放在同一路径下,就能够打开。
这是为什么?

还有,如果在另外一个目录中有同名的文件,使用该程序 打开的 只是当前路径(与可执行文件同路径)下的文件。
难道是代码有问题?
#include <iostream>
#include <dirent.h>
#include <sys/types.h>

using namespace std;
int main(int argc, char* argv[])
{
FILE *fp = NULL;
DIR *dirptr = NULL;
struct dirent *file = NULL;
char filename[256] = "";
char a[1001] = "";

if (argc != 3)
{
cout<<"命令行参数不正确!"<<endl;
cout<<":openfile path filename"<<endl;
return -1;
}

strcpy(filename, argv[2]);
if( (dirptr = opendir(argv[1])) == NULL)
{cout<<"打开目录失败!"<<endl;
exit(0);}
while ((file = readdir(dirptr)) != NULL) {
if ((strcmp(filename, file->d_name)) != 0) continue;
else break;}
closedir(dirptr);
if ( file == NULL ){
cout<<"文件未找到!"<<endl;
exit(0);
}
if((fp = fopen(filename, "r")) == NULL){
cout<<"打开文件失败!"<<endl;
exit(0);
}

你可以看下,在另一个目录的文件你是否有访问权限,同一个目录下一般来说,你把他复制过来,这个文件的拥有者(owner)就是你了,你是肯定可以访问的。每个程序都有一个当前目录的环境变量,你在shell中执行程序时,shell程序就是你执行的程序的父进程,你的程序从shell程序中继承了当前目录,所以你只给定文件名时,当然打开的就是当前目录下的文件了追问

“所以你只给定文件名时”
路径也给出了啊~比如:
在$HOME/bin下有我们的程序openfile,和文件testfile.cpp
在$HOME/下有文件testfile.cpp
在目录$HOME/bin下 执行 openfile $HOME testfile.cpp
输出的文件内容 却是$HOME/bin下testfile.cpp的内容。
(权限都改成了 777)

追答

这个是你的程序的问题的,因为你在fopen之前的动作只是知道所传的目录$HOME下有一个与argv[2]参数相同的文件而已,而并没有改变你的程序当前目录这个环境变量,所以当你调用fopen时,进程的当前目录仍在$HOME/bin下,然后在当前目录下找filename文件打开,当然就是打开的$HOME/bin/filename文件

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-21
做个提示,如果你用的是虚拟主机,有可能这个函数被禁掉了
第2个回答  2012-09-21
这里面有相对路径和绝对路径区分,
第3个回答  2012-09-21
1.路径不正确
2.没有访问路径的相应权限(wrx)
相似回答