首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CFile::osNoBuffer标志在写入文件时导致异常

CFile::osNoBuffer标志在写入文件时导致异常
EN

Stack Overflow用户
提问于 2010-09-24 07:52:02
回答 2查看 1.7K关注 0票数 2

当我使用WINAPI函数编写文件时,(WINAPI winapi文件)在winapi (FILE_FLAG_NO_BUFFERING)中使用的标志工作得很好。

(WINAPI创建文件- CFile -写文件)在这种情况下也发生了错误,但由于CFile对象中缺少文件名,才从winapi CreateFile函数接收到的文件句柄创建的。

(CFile create file - Cfile - file)当我使用此标志( to文件::osNoBuffer)时,当我试图向该文件写入某些内容时,会出现异常,告诉我发生了一些无法识别的错误。

可能出了什么问题?

代码语言:javascript
复制
char chArr [] = "1234567890";
CFile file;
file.Open("c:\\mfc.txt",CFile::modeCreate| CFile::modeNoTruncate| CFile::modeWrite | CFile::osNoBuffer | CFile::osWriteThrough);
file.Write(chArr,sizeof(chArr)); // exception 
file.Flush(); 
file.Close();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-24 14:09:57

请参阅MSDN上对文件缓冲的讨论。

用标志CFile::osNoBuffer打开文件,或者将标志FILE_FLAG_NO_BUFFERING传递给CreateFile,是一种非常特殊的写入文件的方式。它要求用于写入文件的所有缓冲区都对齐到内存中的扇区边界,并且只写入扇区大小的整数倍数。除非您已经采取特殊步骤对齐正在传递的缓冲区(这里没有),并且至少写入了512字节,否则它不太可能工作,除非设备静默地忽略您的标志。我想您可能没有注意到WriteFile返回了一个错误代码,而不是抛出一个异常。

我会问:你为什么要指定这个标志呢?它的使用是相当专门的,如果您只是做正常的日常文件I/O,比如编写文本文件,那么您不应该指定此标志。它可能会减慢您的程序,并使其更加复杂。我还建议您删除CFile::osWriteThrough

让您知道:FILE_FLAG_NO_BUFFERING几乎完全用于编写大量必须直接进入磁盘的数据,例如实时数据记录或视频记录应用程序。FILE_FLAG_WRITE_THROUGH用于数据库日志文件等,这些文件必须在每次写完后才刷新,以确保事务的正确性。在其他情况下,禁用这些缓存和缓冲区通常会减慢程序的速度。

下面是有同样问题的人的另一次讨论 (尽管他们使用的是.NET,而不是C++)。

编辑:谢谢你提到尺寸要求,达里尔。

票数 4
EN

Stack Overflow用户

发布于 2010-09-24 14:25:46

道格在回答中提到的MSDN文件缓冲讨论。

  • 如果指定的话,文件访问大小(包括重叠结构中的可选文件偏移量)必须是卷扇区大小的整数倍的字节数。例如,如果扇区大小为512字节,则应用程序可以请求512、1,024、1,536或2,048字节的读写,但不能请求335、981或7,171字节。
  • 用于读写操作的文件访问缓冲区地址应该对齐扇区,这意味着对齐内存中的地址,这些地址是卷扇区大小的整数倍。根据磁盘的不同,此要求可能不会强制执行。

在我的系统里,改变..。

代码语言:javascript
复制
char chArr[] = "1234567890";

代码语言:javascript
复制
char chArr[512] = "1234567890";

...gets消除了异常,但有一个明显的问题,就是我现在正在为文件编写一堆未初始化的垃圾字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3785163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档