lnhv013710 2019-04-13 09:22 采纳率: 96.7%
浏览 452
已采纳

MFC Csdudiofile::WriteString() Close() 写硬盘的时刻

int nCount=pArrayList.GetCount();//pArrayList存的文件内修改位置和要改的内容
file.Open(path, CFile::modeReadWrite);//读写模式打开文件
for (int i=0;i<nCount;i++)//循环对整个文件的标记位置替换
{
int nPos= pArrayList[i].nStartPos;
file.Seek(nPos, CFile::begin);
CString strWriText=pArrayList[i].strTrac;
file.WriteString(strWriText);//A
}
file.Close();//B
}

上面一段代码,请教A处的WriteString是写的内存还是写的硬盘,担心for循环对硬盘的频繁写操作。另外,是不是B处的Close才真正将已经更改好的内存中的文件写到硬盘???
  • 写回答

2条回答

  • threenewbee 2019-04-13 09:30
    关注

    WriteString从你的程序的角度看是写硬盘,但是操作系统甚至硬盘本身都有缓存机制(一块1TB的机械硬盘,通常有64MB的缓存,而操作系统甚至可以用1GB或者更多的可用内存充当缓存,当你读写文件的时候,这些缓存会使得读写尽可能少,缓存的运作机制是对程序来说透明的,你只是感觉硬盘操作更快),在相当程度上缓解了频繁写操作对性能的影响,而且对于现在的固态硬盘,小文件的读写性能已经比机械硬盘好太多了。

    B处的Close才真正将已经更改好的内存中的文件写到硬盘
    因为缓存的存在,这不一定,Close只是关闭文件句柄。如果你希望验证这一点,那么向硬盘写入10GB的数据(超过你的物理内存的上限,这时缓存就肯定失效了)。然后在Close后面加上一个MessageBox,你可以看到程序运行到了Close,把你的耳朵靠近硬盘。你会发现,Close之后,硬盘还在响

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?