对文件频繁读写的优化方法

geriwolf 2008-01-21 06:00:58
有如下函数,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、请问各位高人,有没有别的方法来解决这个问题?

...全文
1220 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
my_girlf 2008-01-22
  • 打赏
  • 举报
回复
如果是打开同一个文件,当然LZ的方法是很不错的。
geriwolf 2008-01-22
  • 打赏
  • 举报
回复
频繁的打开关闭文件如果次数很多,会有小概率的出错,计算机的I/O是不可信任的。楼上的系统打开/关闭,读/写次数还不是很庞大,我这个几乎每秒都要执行的,并且一旦瘫痪,问题就粗了。

现在对文件的读写太频繁,长期运行对硬盘磁头还有不好的影响,我还得想办法解决。

好了,我的问题已经解决了,之前出现错误是因为指针没有回到文件头,原来在functionB()中每次打开文件都是从文件头读的,现在把open和close放到functionA()里,read/write之后忘记回头了,导致上面的错误,哈哈,太粗心了。

结帖,此楼以上的都有分!
my_girlf 2008-01-22
  • 打赏
  • 举报
回复
LZ,用你这样做会有什么隐患呢?我们公司的一个新闻系统,各个地方通过一个软件把新闻稿件转到服务器上。服务器上有一个软件就是频繁读写这些新传来的文件,进行转换,存入数据库,稿件数量巨大,软件是24小时不停地读写的。

里面的一个转化函数:
TransToDatbase()
{
CFile file;
file.Open();
file.Read();
.....//一些格式转换
file.Close();
.....//写入数据库
}
只要有新的稿件过来,这个函数就会被调用。软件运行这么久以来,没出任何问题。LZ,这会有什么隐患呢?
cnzdgs 2008-01-21
  • 打赏
  • 举报
回复
这种问题通常都是用2楼的方法来做,在A里面定义,通过函数把指针传过去。
如果你不能改变B的参数定义,就只能用全局变量的方式了。你可以定义一个全局的指针变量,然后在A里面new和delete。
wesen1111 2008-01-21
  • 打赏
  • 举报
回复
#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()
{

}
没什么问题啊
我运行调试过的一切正常
geriwolf 2008-01-21
  • 打赏
  • 举报
回复
但是我用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);
}


第一个花括号处,这是什么错误呢?
gentlelotus 2008-01-21
  • 打赏
  • 举报
回复
直觉上使用全局变量(或者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上回帖时写过代码,想看看用起来如何,呵呵
Torch009 2008-01-21
  • 打赏
  • 举报
回复
同意Mackz的做法。
geriwolf 2008-01-21
  • 打赏
  • 举报
回复
上面我是给了个简例,实际中参数已经由另外的函数定死了,这个函数是无法修改的,因为别的模块中需要用到这个函数,是公共代码部分的。
菜牛 2008-01-21
  • 打赏
  • 举报
回复
没必要用静态变量吧,在functionA中循环外面创建CStdioFIle变量,然后把指针作为参数传给functionB不就行了?
shelliu 2008-01-21
  • 打赏
  • 举报
回复
可以尝试在构造函数中打开文件,在析构函数中关闭

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧