Сохранение FILE * в структуру в C - PullRequest
0 голосов
/ 04 декабря 2011

Я пытаюсь открыть файл в функции, которая загружает аргументы, а затем сохранить его в структуре, содержащей аргументы, для последующего использования в других функциях. Однако я не могу сохранить его правильно (FILE * A, * B равно 0x0). Вот что я получил до сих пор:

struct Args
{
       int action;      /* holds action token (see teacts)*/
       int error;
       FILE *A,*B;      /* files containing matrixes*/
       int r,s;         /* start coordinates*/
       int power,dir;   /* used in some other function */
} Args;

void getArgs(int argc, char *argv[],struct Args * args)
{
....
testopen(argv[4],args->A);
....
}

int openFile (const char *arg, FILE *input)
{
        input = fopen(arg,"r");

        if (input == NULL)
                return (1);
        else
                return (0);
}

int main (int argc, char **argv)
{
     struct Args args = {.action = A_ERROR};
     getArgs(argc,argv,&args);
     ....
}

Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 4 ]

1 голос
/ 04 декабря 2011

На ум сразу приходят две проблемы. Во-первых, вы звоните testopen, когда вы явно должны звонить openFile, но я собираюсь предположить, что это просто опечатка.

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

Другими словами, вам понадобится что-то вроде:

int openFile (const char *arg, FILE **input) {
    *input = fopen( arg, "r");
    if (*input == NULL)
        return 1;
    return 0;
}
:
rc = openFile (argv[4], &(args->A));
1 голос
/ 04 декабря 2011

Указатели передаются по значению в C, как и все остальное. Линия:

input = ....;

в openFile только изменяет значение локальной переменной (аргумент) input в этой функции, но не меняет args->A.

Чтобы это исправить, вы можете:

  • передать указатель на args в openFile.

    int openFile (const char *arg, struct Args *args)
    {
        args->A = fopen(arg,"r");
        ...
    
  • передать указатель на args->A (делая аргумент a FILE**):

    int openFile (const char *arg, FILE **input)
    {
        *input = fopen(arg,"r");
        ...
    
  • вообще не пропустите FILE*, но верните один и сделайте:

    args->A = openFile(argv[4]);
    

    Убедитесь, что вы вернули NULL при ошибке, и вы можете выполнить проверку на ошибки в вызывающей стороне.

0 голосов
/ 04 декабря 2011

Я думаю, что это должно быть примерно так:

void getArgs(int argc, char *argv[],struct Args * args)
{
....
openFile(argv[4],&args->A);
....
}

int openFile (const char *arg, FILE **input)
{
        *input = fopen(arg,"r");

        if (*input == NULL)
                return (1);
        else
                return (0);
}
0 голосов
/ 04 декабря 2011

Я считаю, что проблема в том, что ваш инициализатор структуры инициализирует все элементы 0:

struct args args = {.action = A_ERROR};

Это означает, что ваш ФАЙЛ * A, * B получает значения NULL. И, следовательно, вы не можете сохранить в них какие-либо значения. Попробуйте еще раз:

struct args args;
args.atction = A_ERROR;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...