有如下函数,functionB()是对一个文本文件进行读写操作,functionA()中会频繁的调用functionB(),因为I/O是不可信任的,我原本将open()和close()都写在functionB()中,这样会存在隐患。现要对这段代码进行优化。//.h
calss Proj
{
  functionA();
  functionB();
}
//.cpp
functionB()
{
  CStdioFile file;
  file.Open();
  ...;
  file.Close();
}functionA()
{
  ...;
  while(...)
  {
    functionB();
  }
}
1、如果将open()和close()写在functionA()中,这样定义CStdioFile的静态变量在哪里比较合适?头文件?还是CPP文件中函数外,还是functionA()函数内(这个MS不行)?
2、如果定义CStdioFile变量为静态变量,如何初始化?在哪里初始化?
3、请问各位高人,有没有别的方法来解决这个问题?

解决方案 »

  1.   

    没必要用静态变量吧,在functionA中循环外面创建CStdioFIle变量,然后把指针作为参数传给functionB不就行了?
      

  2.   

    直觉上使用全局变量(或者cpp作用域的静态变量)或者单件模式都行,只要函数A和B都能访问到就行。CStdioFIle构造后不需要做什么初始化,在A中先open,循环调用B后close就行。也可以变相的用一个带有静态变量的函数来模拟全局变量。例如://.cpp
    static CStdioFile g_file;
    functionB()
    {
      //CStdioFile& file = g_file;
      //file.Open();
      ...;
      //file.Close();
    }functionA()
    {
      ...;
      g_file.Open();
      while(...)
      {
        functionB();
      }
      g_file.Close();
    }//ps: 这个代码很简单,其实没必要写,主要是没有在csdn上回帖时写过代码,想看看用起来如何,呵呵
      

  3.   

    但是我用5楼的这个方法时,编译没有出错,生成exe后打开出现运行时错误单步调试无法进入函数内部,程序直接跳到 C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\APPMODUL.CPP 的
    extern "C" int WINAPI
    _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine, int nCmdShow)
    {
    // call shared/exported WinMain
    return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
    }
    第一个花括号处,这是什么错误呢?
      

  4.   

    #include "windows.h"
    #include <stdio.h>
    void funtiona();
    void funtionb();
    void main()
    {
    funtiona();}
    void funtiona()
    {
    static FILE *file=fopen("c:\\wesen.txt","r+");
    while(1)
    {
    funtionb();
    }
    fclose(file);}
    void funtionb()
    {}
    没什么问题啊
    我运行调试过的一切正常
      

  5.   

    这种问题通常都是用2楼的方法来做,在A里面定义,通过函数把指针传过去。
    如果你不能改变B的参数定义,就只能用全局变量的方式了。你可以定义一个全局的指针变量,然后在A里面new和delete。
      

  6.   

    LZ,用你这样做会有什么隐患呢?我们公司的一个新闻系统,各个地方通过一个软件把新闻稿件转到服务器上。服务器上有一个软件就是频繁读写这些新传来的文件,进行转换,存入数据库,稿件数量巨大,软件是24小时不停地读写的。里面的一个转化函数:
    TransToDatbase()
    {
    CFile file;
    file.Open();
    file.Read();
    .....//一些格式转换
    file.Close();
    .....//写入数据库
    }
    只要有新的稿件过来,这个函数就会被调用。软件运行这么久以来,没出任何问题。LZ,这会有什么隐患呢?
      

  7.   

    频繁的打开关闭文件如果次数很多,会有小概率的出错,计算机的I/O是不可信任的。楼上的系统打开/关闭,读/写次数还不是很庞大,我这个几乎每秒都要执行的,并且一旦瘫痪,问题就粗了。现在对文件的读写太频繁,长期运行对硬盘磁头还有不好的影响,我还得想办法解决。好了,我的问题已经解决了,之前出现错误是因为指针没有回到文件头,原来在functionB()中每次打开文件都是从文件头读的,现在把open和close放到functionA()里,read/write之后忘记回头了,导致上面的错误,哈哈,太粗心了。结帖,此楼以上的都有分!