Возвращение ФАЙЛА * - PullRequest
       6

Возвращение ФАЙЛА *

0 голосов
/ 13 февраля 2010

Почему этот код выдает предупреждение?

FILE* my_open_file(char* filename)
{
  FILE* fp=fopen(filename,"r");
  if(fp==NULL)
    {
      perror("Error opening file");
      return -1;
    }
  return fp;
}
  • asdf.c: в функции «my_open_file»:
  • asdf.c: 9: предупреждение: возврат делает указатель от целого числа без приведения

fp уже указатель, а не целое число, насколько я вижу.

Ответы [ 4 ]

7 голосов
/ 13 февраля 2010

Компилятору не нравится return -1, который имеет тип int - но my_open_file должен возвращать указатель на FILE.

Используйте return NULL;, чтобы сообщить об ошибке.

2 голосов
/ 13 февраля 2010

Я думаю, что это предупреждение, чтобы вернуть -1

Вместо этого просто используйте «return NULL»

1 голос
/ 13 февраля 2010

Как уже говорили другие, вы хотите вернуть указатель в любом случае, потому что ваша функция объявлена ​​как возвращающая FILE *. Таким образом, вы должны вернуть NULL, если fopen() не удалось, и возвращаемое значение fopen(), если это не так.

Но тогда ваша функция (почти) эквивалентна fopen()! Другими словами, вы можете заменить свою функцию на:

FILE* my_open_file(char* filename)
{
    FILE *fp = fopen(filename);
    if (fp == NULL) {
        fprintf(stderr, "Unable to open file %s", filename);
        perror(NULL);
    }
    return fp;
}

fopen() не гарантирует установки errno, поэтому я добавил вызов fprintf() с именем файла в дополнение к вызову perror(). Кроме того, в сообщениях об ошибках рекомендуется не указывать имя файла, если файл не открывается.

0 голосов
/ 13 февраля 2010

Вы возвращаете -1 при ошибке, которая затем должна быть неявно приведена к ФАЙЛУ *

...