C 当main(argv[]中给定值时,为什么fopen会失败

C 当main(argv[]中给定值时,为什么fopen会失败,c,fopen,C,Fopen,这是我的节目 #include <ncurses.h> int main( int argc, char *argv[] ) { initscr(); FILE *fd; char *ProgFile; ProgFile = argv[1]; printw(ProgFile); refresh(); fd = fopen(ProgFile,"rb"); if( fd==NULL ) { p

这是我的节目

#include <ncurses.h>

int main( int argc, char *argv[] )
{
    initscr();
    FILE *fd;
    char *ProgFile;

    ProgFile = argv[1];
    printw(ProgFile);
    refresh();

    fd = fopen(ProgFile,"rb");

    if( fd==NULL )
    {
        printw("error");
        perror ("The following error occurred");
        refresh();
    }
    else
    {
        printw("bin file loaded: '%s'",ProgFile);
        refresh();
    }

    getch();
    endwin();

    return 0;
}
#包括
int main(int argc,char*argv[])
{
initscr();
文件*fd;
字符*程序文件;
ProgFile=argv[1];
printw(ProgFile);
刷新();
fd=fopen(ProgFile,“rb”);
如果(fd==NULL)
{
printw(“错误”);
perror(“发生以下错误”);
刷新();
}
其他的
{
printw(“加载的bin文件:'%s',ProgFile”);
刷新();
}
getch();
endwin();
返回0;
}
当运行它时,给出以下错误消息:没有这样的文件或目录

但是如果我硬编码ProgFile=“filemname.bin”;然后程序就完美地工作了

当程序运行时,当询问ProgFile的值时,两个版本都会打印filemname.bin

我已经试着解决这个问题两天了,不知道发生了什么。谁能告诉我怎么了


这是Linux CINOS/< P> < P>的C++,首先是C而不是C++。我在代码中没有看到任何C++。 这个

#包括
#包括
int main(int argc,char*argv[])
{
文件*fd;
字符*程序文件;
ProgFile=argv[1];
printf(ProgFile);
fd=fopen(ProgFile,“rb”);
如果(fd==NULL)
{
printf(“错误”);
}
其他的
{
printf(“加载的bin文件:“%s”,ProgFile);
}
返回0;
}

对我来说非常好。确保传递了正确的参数和正确的路径。我建议您传递整个路径,而不仅仅是filemname.bin。

程序在其当前工作目录中查找相对文件名(不以
/
开头的文件名);这是从父级继承的,如果从命令行执行程序,父级就是shell,并且可以在从启动器运行程序时显式设置。因此,您需要确保程序在文件所在的同一目录中启动


(您也可以使用绝对路径或显式的
chdir
系统调用文件所在的目录,但两者都很难看,几乎不可能移动程序。)

路径为硬编码时,程序是否打开文件?(为什么在C++中使用<代码> STDIO < /代码>而不是<代码> IOSWATION/COD>?)你检查了工作目录吗?访问权限?你能stat()文件吗?@arne文件很好,在硬编码时打开,而不是在传入名称时打开。我想这可能是某种类型不匹配的问题,但我对它了解不够,无法进一步调试它。@Skeith,你是在同一目录下运行两个版本的程序吗?(不可能有类型错误,因为就
fopen
而言,路径名只是
char
数组。)请注意:您的代码使用
peror
打印
fopen
的错误,但是
errno
可以由
printw
设置,如果它本身失败。以后尽量避免这种情况。你使用的库与我使用的库不同。ncurses应该有stdio,但我不确定它是否完全相同。您是否也在linux上运行该程序?Ncurses没有“包含
stdio
”。它只包括页眉,没关系。这些库仅用于显示结果。关键是fopen的论点是正确的。不幸的是,没有,我正在工作,所以我不得不在WindowsXP上试用(无论如何都要使用GCC)。不管怎样,Windows/Linux。。。没关系。该代码可以工作,并且在任何操作系统中都可以。我坚持认为您的问题在于文件路径。输入完整的路径,而不仅仅是文件名,它就会工作。
#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
    FILE *fd;
    char *ProgFile;

    ProgFile = argv[1];
    printf(ProgFile);

    fd=fopen(ProgFile,"rb");

    if( fd==NULL )
    {
        printf("error");
    }
    else
    {
        printf("bin file loaded: '%s'",ProgFile);
    }

    return 0;
}