Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中创建和打开一个文件,并使其可供整个程序使用?_C_File - Fatal编程技术网

如何在C中创建和打开一个文件,并使其可供整个程序使用?

如何在C中创建和打开一个文件,并使其可供整个程序使用?,c,file,C,File,我想为一个程序创建一个日志文件,为此我想创建并打开一个.txt文件,并使整个程序都可以使用它来写入 例如,我有一个全局文件指针fp,它是在文件“debug.c”中创建的。现在,我使用一个函数打开了该文件: void initlog() { fp = fopen("filename.txt","w"); } 如果我使用上述函数打开文件,是否可以在程序的其他部分写入/附加到同一文件 我是否可以使用extern关键字与其他文件共享fp,是否可以通过该关键字获取其他文件中打开的

我想为一个程序创建一个日志文件,为此我想创建并打开一个
.txt
文件,并使整个程序都可以使用它来写入

例如,我有一个全局文件指针
fp
,它是在文件“debug.c”中创建的。现在,我使用一个函数打开了该文件:

void initlog()
   {
      fp = fopen("filename.txt","w");
   }
如果我使用上述函数打开文件,是否可以在程序的其他部分写入/附加到同一文件

我是否可以使用
extern
关键字与其他文件共享
fp
,是否可以通过该关键字获取其他文件中打开的文件指针(
fp

编辑 无法使用线程,因为它是单线程程序

您可以尝试此操作

freopen("file.txt","w",stdout);
这将使您的printf写入文件

若要追加,请使用“a”而不是“w”。

您可以尝试此操作

freopen("file.txt","w",stdout);
这将使您的printf写入文件


若要追加,请使用“a”而不是“w”。

而不是使用全局文件指针,您可以在调用中封装日志记录

e、 g

优点是即使程序崩溃,它也会被刷新到磁盘上。您还可以决定输出的特殊格式,例如添加时间戳等


它的缺点可能会导致大量文件I/O或性能损失,这取决于您的用例,而不是使用全局文件指针,您可以在调用中封装日志记录

e、 g

优点是即使程序崩溃,它也会被刷新到磁盘上。您还可以决定输出的特殊格式,例如添加时间戳等


它的缺点可能会导致大量文件I/O或性能损失,这取决于您的用例

如果您不使用线程,我认为这没有问题。是的。但可以说,最好不要这样做。而是实现一个日志记录功能,它导出API以写入日志。程序的其他部分将调用API,而不是直接写入文件。@AlanAu您所说的日志记录功能是什么意思??如果我想写入日志,那么我还需要一个打开的文件指针,因此我必须经常打开和关闭文件,为了避免这种情况,我可以第一次打开文件并将打开的文件指针设置为全局,然后在需要时写入文件并在日志末尾关闭文件吗?,这样我就可以避免频繁地打开和关闭文件。不,你不需要把fp给每个人。在debug.c中实现
initlog
和一个附加的
wrtitelog
函数。只有那些函数需要fp。其他地方只需调用
writelog
。这只是一个简单的例子。一个真正的日志记录设施可以做更多的工作(例如不同级别的日志记录)。这只是标准的模块化设计。因此,如果您想稍后更改日志记录(例如改为写入控制台),则只需要更改内部日志记录实现。如果您不使用线程,我认为这没有问题。是的。但可以说,最好不要这样做。而是实现一个日志记录功能,它导出API以写入日志。程序的其他部分将调用API,而不是直接写入文件。@AlanAu您所说的日志记录功能是什么意思??如果我想写入日志,那么我还需要一个打开的文件指针,因此我必须经常打开和关闭文件,为了避免这种情况,我可以第一次打开文件并将打开的文件指针设置为全局,然后在需要时写入文件并在日志末尾关闭文件吗?,这样我就可以避免频繁地打开和关闭文件。不,你不需要把fp给每个人。在debug.c中实现
initlog
和一个附加的
wrtitelog
函数。只有那些函数需要fp。其他地方只需调用
writelog
。这只是一个简单的例子。一个真正的日志记录设施可以做更多的工作(例如不同级别的日志记录)。这只是标准的模块化设计。因此,如果您希望稍后更改日志记录(例如改为写入控制台),则只需要更改内部日志记录实现。