Как преобразовать массив char в тип FILE в C ++ - PullRequest
0 голосов
/ 17 июня 2020

Я разработчик C#, поэтому меня немного смущает этот язык. Проблема здесь в том, что я работаю с другим кодом, и мне просто нужно внести небольшое изменение. Мне нужно изменить функцию, которая принимает параметр пути к файлу и использует fopen () для загрузки его в тип ФАЙЛ, на функцию, которая просто принимает массив символов и преобразует его в тип ФАЙЛ

Как это выглядит правильно сейчас:

bool ExampleFunction::Load(const string& fileName)
{
    string f = filename;


    FILE* fp = fopen(f.c_str(), "rb");
}

Как я хочу (псевдокод):

bool ExampleFunction::Load(const char* fileBytes)
{
    FILE* fp = fopen(fileBytes, "rb");
}

1 Ответ

0 голосов
/ 17 июня 2020

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

  • Если вы храните указатель файла в переменной-члене, проверьте, был ли файл уже открыт до , и закройте его, если необходимо.
  • Если вы просто загружаете некоторые данные из файла в локальные переменные, не забудьте снова fclose файл потом .

В противном случае вы получите утечку памяти.

Однако внутри вашей исходной функции вы создаете совершенно бесполезную копию входной строки:

bool ExampleFunction::Load(const string& fileName)
{
    string f = filename; // <--- copy!!!

    FILE* fp = fopen(f.c_str(), "rb");
}

Либо используйте параметр напрямую:

FILE* fp = fopen(filename.c_str(), "rb");

или, если вам нужен более короткий псевдоним, снова создайте его как ссылку:

 string const& f = filename;
 // alternatively:
 auto& f = filename;
 //  ^ don't forget, otherwise copy again

Я лично рекомендую сохранить исходную функцию как перегрузку:

bool ExampleFunction::Load(char const* filename);
bool ExampleFunction::Load(std::string const& filename)
{
    return Load(filename.c_str());
}

, чтобы пользователи, сохранившие имя файла в объекте std::string, могут использовать его напрямую.

...