当我使用WINAPI函数编写文件时,(WINAPI winapi文件)在winapi (FILE_FLAG_NO_BUFFERING)中使用的标志工作得很好。
(WINAPI创建文件- CFile -写文件)在这种情况下也发生了错误,但由于CFile对象中缺少文件名,才从winapi CreateFile函数接收到的文件句柄创建的。
(CFile create file - Cfile - file)当我使用此标志( to文件::osNoBuffer)时,当我试图向该文件写入某些内容时,会出现异常,告诉我发生了一些无法识别的错误。
可能出了什么问题?
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();发布于 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++)。
编辑:谢谢你提到尺寸要求,达里尔。
发布于 2010-09-24 14:25:46
道格在回答中提到的MSDN文件缓冲讨论。
在我的系统里,改变..。
char chArr[] = "1234567890";至
char chArr[512] = "1234567890";...gets消除了异常,但有一个明显的问题,就是我现在正在为文件编写一堆未初始化的垃圾字节。
https://stackoverflow.com/questions/3785163
复制相似问题