在C / C ++中声明和使用FILE *指针的正确方法是什么?是应该宣布全球还是本地?有人能展示一个好榜样吗?
答案 0 :(得分:18)
无论是本地还是全球,都无关紧要。文件指针的范围与其使用无关。
一般来说,尽可能避免全局变量是一个好主意。
以下是展示如何从input.txt
复制到output.txt
的示例:
#include <stdio.h>
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;
}
答案 1 :(得分:4)
它只是一个普通的指针,就像任何其他指针一样。
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
}
答案 2 :(得分:1)
这是谷歌第一次点击“文件io in c”
http://www.cs.bu.edu/teaching/c/file-io/intro/
这是来自gamedev的第三次点击,更多的是C ++倾斜
http://www.gamedev.net/reference/articles/article1127.asp
您在需要的范围内声明指针。
答案 3 :(得分:1)
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 ++。
编辑:添加了一些错误检查。始终在代码中使用错误检查。
答案 4 :(得分:0)
首先,请记住文件指针(以及关联的分配结构)基于较低级别的open()read()write()调用。关联的文件描述符(由fileno(file_pointer)获取)是最不感兴趣的事情,但您可能希望观察范围。
如果你要在模块中将文件指针声明为全局,那么保持静态(包含在该模块/目标文件中)通常是个好主意。有时这比将它存储在从一个函数传递到另一个函数的结构中要容易一些,如果你需要匆忙写一些东西。
例如,(糟糕)
#include <stdio.h>
#include ...
#define MY_LOG_FILE "file.txt"
FILE *logfile
最好完成:
#include <stdio.h>
#define MY_LOG_FILE "file.txt"
static FILE *logfile;
int main(void)
{
除非您需要几个模块才能访问该指针,在这种情况下,最好将它放在可以传递的结构中。
如果仅在一个模块中需要它,请考虑在main()中声明它并让其他函数接受文件指针作为参数。所以,除非模块中的函数有太多的参数,否则另一个参数将无法忍受..(通常)没有理由全局声明文件指针。
有些日志库会这样做,我不在乎......特别是在处理可重入函数时。没关系C的整体名称空间:)