ФАЙЛ * инициализация в другой функции с ++ - PullRequest
0 голосов
/ 05 мая 2018

Мне нужно инициализировать FILE * fi в другой функции. Этот пример кода показывает проблему.

#include<iostream>
using namespace std;

void init(FILE* fi) 
{ 
    fi=fopen("in.txt", "r");    
    if(fi==NULL) 
    {       
        cout<<"Got NULL\n";     
    } 
}

int main()  
{   
    FILE* fi;   
    init(fi);   
    if(fi==NULL)    
    {       
        cout<<"NULL\n";         
        return 0;   
    }   
    return 0;  
}

Программа выводит NULL (не "Got NULL"), и я понятия не имею, как заставить его работать ...


Важно, чтобы я передал fi как указатель, а не как возвращаемое значение.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы не должны манипулировать аргументами, если это не определенная цель кода. Лучше просто вернуть вещи:

FILE* init()
{ 
    return fopen("in.txt", "r");
}

Тогда вы называете это так:

FILE* fi = init();

Обратите внимание, что, поскольку вы используете C ++, вам следует избегать использования анахронизмов C, таких как FILE, и вместо этого использовать файловые потоки C ++.

Если вам нужно обработать несколько возвращаемых значений:

std::tuple<FILE*, FILE*> init() {
  return std::make_tuple(
    fopen("in.txt", "r"),
    fopen("out.txt", "w")
  );
}

Это всего лишь шаг к созданию правильного кода C ++ путем инкапсуляции всего этого в правильном определении class, а затем вы можете напрямую манипулировать свойствами:

class FileWrapper {
public:
  FileWrapper();
  ~FileWrapper();
  void init();

protected:
  FILE *fi;
  FILE *fo;
}

void FileWrapper::init() {
  fi = fopen("in.txt", "r");
  fo = fopen("out.txt", "w");
}

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

0 голосов
/ 05 мая 2018

ОК, понял.

Replase

void init(FILE* fi) 

с

void init(FILE*&fi) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...