为什么fopen在从main(argv [])给出值时失败

时间:2011-09-28 11:35:49

标签: 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 )
    {
        printw("error");
        perror ("The following error occurred");
        refresh();
    }
    else
    {
        printw("bin file loaded: '%s'",ProgFile);
        refresh();
    }

    getch();
    endwin();

    return 0;
}

运行时给出此错误消息:没有这样的文件或目录。

但如果我硬编码ProgFile =“filemname.bin”;然后程序运行得很好。

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

我一直试图解决这个问题2天,并且不知道发生了什么。有谁能告诉我出了什么问题?

这是Linux centos上的c ++

2 个答案:

答案 0 :(得分:3)

首先,这是C而不是C ++。我的代码中没有看到任何C ++。

#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;
}

对我来说效果很好。确保你传递正确的参数和正确的路径。我建议你传递整个路径,而不仅仅是 filemname.bin

答案 1 :(得分:1)

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

(你也可以使用一个绝对路径或者做一个明确的chdir系统调用文件所在的目录,但两者都是丑陋的,并且几乎不可能移动程序。)