почему fopen терпит неудачу, когда задано значение из main (argv []) - PullRequest
2 голосов
/ 28 сентября 2011

это моя программа

#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";тогда программа работает отлично.

при запуске программы обе версии выводят файл filemname.bin при запросе значения ProgFile.

Я пытался решить эту проблему в течение 2 дней и понятия не имею, что происходит.может кто-нибудь сказать мне, что не так?

это с ++ на linux centos

Ответы [ 2 ]

3 голосов
/ 28 сентября 2011

Во-первых, это 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 голос
/ 29 сентября 2011

Программа ищет относительные имена файлов (не начинающиеся с /) в своем текущем рабочем каталоге; это наследуется от родителя, который является оболочкой, если вы запускаете программу из командной строки, и может быть задан явно, когда вы запускаете ее из стартера. Итак, вам нужно убедиться, что программа запущена в том же каталоге, в котором находится файл.

(Вы также можете использовать абсолютный путь или сделать явный системный вызов chdir каталога, в котором находится файл, но оба они уродливы и сделать перемещение программы практически невозможным.)

...