2009-12-11 6 views
6

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

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

int open_text_file(char text_file_name[]) 
{ 
    FILE *fp; 

    if((fp = fopen(text_file_name, "r")) != 0) 
    { 
      return fp; 
    } 

    else 
    { 
      printf("Cannot open file \"%s\"\n", text_file_name); 
    } 
} 
+1

Вы пытаетесь вернуть указатель на структуру 'FILE' как' int'. Что (помимо этой ошибки) вы видите? –

+1

Как проблема стиля кодирования, вы должны сравнивать 'fp' с' NULL' вместо '0'. Если также может быть яснее отделить назначение и сравнение 'fp' в отдельных операторах. –

ответ

11

В первой строке, у вас есть

int open_text_file(char text_file_name[]) 

Объявляет тип возвращаемого как int То, что вы должны иметь это

FILE * open_text_file(char text_file_name[]) 

Как хорошо, в вашей "еще" case, вы должны вернуть что-то, чтобы указать сообщение об ошибке вызывающему.

return NULL 

является подходящим выбором. Убедитесь, что вы проверяете возвращаемое значение, когда вы его вызываете.

+0

Отлично, теперь я могу передать argv [1] функции и распечатать контент из основного. Как многие из вас говорят, я должен сравнить fp с NULL, почему? – KJ0090

+0

На некоторых необычных платформах NULL может не быть 0. Это неверно в C++, но в большинстве случаев на практике. – McPherrinM

0

FILE* open_text_file(); должен быть прототипом.

int не является FILE*.

6

Функция немного бессмысленна, поскольку все, что она делает, это то, что делает fopen(), а также сообщение об ошибке. Это не очень хороший дизайн, так как ветка ошибки также должна возвращать указатель (предположительно NULL), который затем должен быть снова проверен в вызывающем коде. Лучше было бы просто сказать:

FILE * fp = fopen(somefile, "r"); 
if (fp == NULL) { 
    fprintf(stderr, "Cannot open %s\n", somefile); 
    exit(1); // or whatever you need to do to handle the error 
} 
+0

+1, эта функция действительно бессмысленная. –

Смежные вопросы