在C / C ++中声明和使用FILE *指针的正确方法是什么?

在C / C ++中声明和使用FILE *指针的正确方法是什么? 是应该宣布全球还是本地? 有人能展示一个好榜样吗?

它无论是本地还是全球都无关紧要。 文件指针的范围与其使用无关。

一般来说,尽可能避免全局变量是个好主意。

这是一个示例,展示了如何从input.txt复制到output.txt

 #include  int main(void) { FILE *fin, *fout; int c; // Open both files, fail fast if either no good. if ((fin = fopen("input.txt", "r")) == NULL) { fprintf(stderr, "Cannot read from input.txt"); return 1; } if ((fout = fopen("output.txt", "w")) == NULL) { fprintf(stderr, "Cannot write to output.txt"); fclose(fin); return 1; } // Transfer character by character. while ((c = fgetc(fin)) >= 0) { fputc (c, fout); } // Close both files and exit. fclose(fin); fclose(fout); return 0; } 

它只是一个普通的指针,就像任何其他指针一样。

 FILE *CreateLogFile() { return fopen("logfile.txt","w"); // allocates a FILE object and returns a pointer to it } void UsefulFunction() { FILE *pLog = CreateLogFile(); // it's safe to return a pointer from a func int resultsOfWork = DoSomeWork(); fprintf( pLog, "Work did %d\n", resultsOfWork ); // you can pass it to other functions fclose( pLog ); // just be sure to clean it up when you are done with fclose() pLog = NULL; // and it's a good idea to overwrite the pointer afterwards // so it's obvious you deleted what it points to } 

这是谷歌第一次点击“文件io in c”

http://www.cs.bu.edu/teaching/c/file-io/intro/

这是gamedev的第三次打击,更多的是C ++倾斜

http://www.gamedev.net/reference/articles/article1127.asp

您在所需范围内声明指针。

 int main(void) { char c; FILE *read; read = fopen("myfile", "r"); // opens "myfile" for reading if(read == NULL) { perror("Error: could not open \"myfile\" for reading.\n"); exit(1); } c = fgetc(read); fclose(read); printf("The first character of myfile is %c.\n", c); return 0; } 

如果您愿意,您可以完全允许声明全局文件句柄,就像任何其他变量一样,但可能不建议这样做。

这是C方式。 C ++可以使用它,但我认为有一种更加C ++友好的方式。 作为一个注释,我讨厌将问题标记为C / C ++时,因为C和C ++ 不是同一种语言而且工作方式不同。 C ++有许多不同的方法来处理C所没有的东西,并且它们在C ++的上下文中可能更容易,但是它们不是有效的C.所以虽然这对任何一种语言都有效,但它不是你的想要主要使用C ++。

编辑:添加了一些错误检查。 始终在代码中使用错误检查。

首先,请记住文件指针(以及关联的分配结构)基于较低级别的open()read()write()调用。 关联的文件描述符(由fileno(file_pointer)获得)是最不感兴趣的东西,但您可能希望观察范围。

如果你要在模块中将文件指针声明为全局,那么保持静态(包含在该模块/目标文件中)通常是个好主意。 有时这比将它存储在从一个函数传递到另一个函数的结构中要容易一些,如果你需要匆忙写一些东西。

例如,(坏)

 #include  #include ... #define MY_LOG_FILE "file.txt" FILE *logfile 

做得更好:

 #include  #define MY_LOG_FILE "file.txt" static FILE *logfile; int main(void) { 

除非您需要几个模块才能访问该指针,在这种情况下,最好将它放在可以传递的结构中。

如果仅在一个模块中需要它,请考虑在main()中声明它并让其他函数接受文件指针作为参数。 所以,除非模块中的函数有太多的参数,否则另一个参数将无法忍受..(通常)没有理由全局声明文件指针。

有些日志库会这样做,我不关心…特别是在处理可重入函数时。 没关系C的单片命名空间:)