C++ C++;将文件*作为参数传递给函数

C++ C++;将文件*作为参数传递给函数,c++,windows,file,arguments,C++,Windows,File,Arguments,我想将一个文件*传递给另一个函数。在此函数中,使用fread从文件中读取一些字节。不执行任何写入操作 我想知道我是否应该说 void DoSomething(FILE *uFile) 或 我害怕在某处引入内存泄漏,并认为康斯特可能更安全。 我担心当我不正确地传递文件时,函数可能会创建文件的副本 我创建文件*如下所示: FILE *outfile = fopen("c:\\myfile.dat", "wb"); 谢谢。您可以选择: void DoSomething(常量文件*uFile) 不

我想将一个文件*传递给另一个函数。在此函数中,使用fread从文件中读取一些字节。不执行任何写入操作

我想知道我是否应该说

void DoSomething(FILE *uFile)

我害怕在某处引入内存泄漏,并认为康斯特可能更安全。 我担心当我不正确地传递文件时,函数可能会创建文件的副本

我创建文件*如下所示:

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

您可以选择:

void DoSomething(常量文件*uFile)

不会创建文件的副本。

您可以使用:

void DoSomething(常量文件*uFile)


不会创建文件的副本。

无论您将
文件*
传递给什么函数,最终都会调用
fread
/
fscanf
/
fwhatever
。如果您看一下,所有这些函数都采用(非常量)
文件*

您需要准备好满足这些功能的需要。如果它们被原型化为接受一个非常量参数,并且您尝试给它们一个常量参数,您将得到一个编译器警告


出于这个原因,我会传入一个非常量的
文件*

无论您将
文件*
传递给什么函数,它最终都会调用
fread
/
fscanf
/
fwhatever
的一些变量。如果您看一下,所有这些函数都采用(非常量)
文件*

您需要准备好满足这些功能的需要。如果它们被原型化为接受一个非常量参数,并且您尝试给它们一个常量参数,您将得到一个编译器警告


因此,我会传入一个非常量
文件*

当您将指向该对象的指针作为参数传递时,C++永远不会复制该对象。Const不是用来声明复制的,它是用来声明修改的。所以你不必担心泄露。正如其他人所指出的,所有接受
文件*
的函数都是非常量函数,因此无论如何,您只需将其丢弃。

C++在将指针作为参数传递给该对象时,将永远不会复制该对象。Const不是用来声明复制的,它是用来声明修改的。所以你不必担心泄露。正如其他人所指出的,所有接受
FILE*
的函数都是非常量函数,因此您只需丢弃它。

如果我不添加“const”,该怎么办?购买添加常量可以确保函数DoSomething()不会更改文件结构的任何成员。它不能保证文件内容不能更改。如果不使用const DoSomething()进行传递,则可以更改传递的文件结构的任何成员。并且,正如abelenky所述,编译器将在您使用标准C库中的任何函数时发出警告,因为它们都不需要const file*参数,仅仅是因为即使在读取文件时,如果只是为了跟踪缓冲区和文件指针的位置,没有任何东西可以保证底层结构不会更改。如果我不添加“const”会怎么样?购买adding const可以确保函数DoSomething()不会更改文件结构的任何成员。它不能保证文件内容不能更改。如果不使用const DoSomething()进行传递,则可以更改传递的文件结构的任何成员。并且,正如abelenky所述,编译器将在您使用标准C库中的任何函数时发出警告,因为它们都不需要const file*参数,仅仅是因为即使在读取文件时,如果只是为了跟踪缓冲和文件指针位置,没有任何东西可以保证底层结构不会更改。是否真的需要传递文件指针?是否真的需要传递文件指针?我认为您实际上应该得到一个警告,提示您放弃C中的常量限定符,在C++中出错。谢谢,我只是注意到了。我认为你应该得到一个警告,在C中放弃const限定符,C++中有一个错误。谢谢,我刚刚注意到了。
FILE *outfile  = fopen("c:\\myfile.dat", "wb");