当前位置:  开发笔记 > 编程语言 > 正文

文件指针行为?

如何解决《文件指针行为?》经验,为你挑选了1个好方法。

这是参考我之前提出的问题 -

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

MyFile.h
char         sMsg[712]      = "";

#define STD_MSG(string) \
fprintf (stderr, string)

#define ERR_MSG(fp, string) \
fprintf (fp, "%s\n", string);\
fflush (fp)

MyFile.C
#include "PdmTestClnt.h"

//---------------------------------------------------------------
// ** Global variables
//---------------------------------------------------------------
FILE * fpErr = NULL;

funcxyz() {
//FILE * fpErr1 = NULL; 
sprintf (sMsg, "************ CHECKING FOR THE CRASH ************. \n");
ERR_MSG (fpErr, sMsg);
//ERR_MSG (fpErr1, sMsg);
}

//========================================================================
// Main
//========================================================================
integer main (integer argc, char ** argv)
{
   //FILE * fpErr = NULL;

   if (!(fpErr = sysFopen (sErrFileName, "a+")))
   {
      sprintf (sMsg,"Error in opening file %s", sErrFileName);
      STD_MSG (sMsg);
   }

     // Log in the error file
     sprintf (sMsg, "Log into the error file. \n");
     ERR_MSG (fpErr, sMsg);

funcxyz();

}

如果File指针声明为global,则它可以工作.但如果它被声明为local,则会导致内存错误(coredump).

跑上:

HP Unix Itanium

aCC编译器(C++编译器)

有人可以解释一下这种行为吗?

编辑:抱歉没有编辑问题.我现在理解printf()/ fprintf()的问题.在我的回答中,我在Windows上使用Dev C++编译器显示了printf()/ fprintf()的结果.但是当我使用aCC编译器在HP Unix上运行它时,它会完全忽略%s并始终正确打印字符串.那么如何让我的架构师在没有向他展示Unix内存故障的情况下更改它呢?

谢谢.



1> Logan Capald..:

假设本地意味着funcxyz()取消注释fpErr1,它会因为你没有打开文件而发生段错误.你不能只NULL在那里使用,你期望数据在哪里?

我建议写funcxyzfpErr1作为参数,如:

funcxyz(FILE *fpErr1) {
   //FILE * fpErr1 = NULL; 
   sprintf (sMsg, "************ CHECKING FOR THE CRASH ************. \n");
   ERR_MSG (fpErr1, sMsg);
   //ERR_MSG (fpErr1, sMsg);
}

然后从main调用它:

 ...
 funcxyz(fpErr);
 ...

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有