2013-10-12 4 views
1

Я хочу передать FILE * другой функции. В этой функции некоторые байты считываются из файла с использованием fread. Запись не выполняется.C++ Pass FILE * как аргумент функции

мне было интересно, если я должен сказать

void DoSomething(FILE *uFile) 

или

void DoSomething(const FILE *uFile) 

я боялся ввести утечку памяти где-то и думал, что, может быть Const безопаснее. Я боялся, что функция может создать копию файла или когда я передам его неправильно.

создать FILE *, как так:

FILE *outfile = fopen("c:\\myfile.dat", "wb"); 

Спасибо.

+0

действительно ли нужно передать указатель файла? – Arpit

ответ

4

Независимо от функции вы передаете ваш FILE* к, в конечном счете, будет вызывать некоторые вариант fread/fscanf/fwhatever. Если вы посмотрите, ВСЕ эти функции принимают (не const) FILE*.

Вы должны быть готовы предоставить эти функции, что им требуется. Если они прототипированы для принятия неконстантного параметра, и вы пытаетесь дать им параметр const, вы получите предупреждение о компиляторе.

По этой причине, я передам в неконстантном FILE*

+2

Вы получите сообщение об ошибке, а не предупреждение. –

+0

Я думаю, вы действительно должны получить предупреждение об отбрасывании конструктора const в C и ошибку на C++. –

+0

Спасибо, я только что заметил это. – tmighty

0

Вы можете пойти с:

void DoSomething(const FILE *uFile)

Нет дубликат файла не создается.

+0

А что, если я не добавлю «const»? – tmighty

+0

buy add const гарантирует, что функция DoSomething() не изменяет член структуры FILE. Это не гарантирует, что содержимое файла не может быть изменено. – Dinesh

+0

Если вы пройдете без const, DoSomething() может изменить любой член переданной структуры FILE. – Dinesh

1

C++ никогда не будет копировать объект при передаче указателя на этот объект в качестве параметра. Константу не нужно делать заявления о копировании, он должен делать заявления об изменении. Поэтому вам не нужно беспокоиться о утечках. Как указывали другие, все функции, которые принимают FILE*, принимают его неконстантно, так что вам нужно было просто отбросить его.

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