如何使用Win32应用编程接口将文件写入共享内存?
我有这样的代码:
hFile = CreateFile("input.map",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
hMapFile = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
0,
TEXT("SharedObject"));
lpMapAddress = (LPTSTR) MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
ReadFile(
hFile,
lpMapAddress,
75,
&bytesRead,
NULL);
sprintf((char*)lpMapAddress, "<output 1>");
printf((char*) lpMapAddress);
但是,printf调用只返回"< output 1 >“,而不返回文件的内容。
编辑:找到问题所在。当我调用sprintf时,我正在写入输入文件。但我还是不知道为什么..。
发布于 2009-09-14 19:17:03
这是整个代码示例吗?在我看来,对sprintf
的调用在lpMapAddress
中放置了一个以null结尾的字符串,这实际上会覆盖您从文件中读取的任何内容--至少对于printf
语句而言是这样。
如果想要用字符串"<output 1>"
替换所读取内容的第一部分,可以在读取文件后执行此操作:
char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));
它复制字符串的文本,但不复制它的空终止符。
发布于 2009-09-14 19:17:05
sprintf
在<output 1>
之后存储NUL,printf
在第一个NUL处停止。
(此外,将一些随机文件作为格式传递给printf
也不是一个好主意。如果它包含%
字符呢?但这是另一个问题。)
当我调用
时,我正在写入输入文件。但我还是不知道为什么..。
因为这就是MapViewOfFile
所做的。它将文件的内容与一个内存块关联起来。文件的当前内容显示在内存块中,您对该内存所做的任何更改都会写入到文件中。
发布于 2009-09-14 19:26:12
我不认为你需要在映射后调用ReadFile。只需从lpMapAddress访问内容即可。
但是,对MapViewOfFile使用常量不会从使用内存文件映射中获益。
https://stackoverflow.com/questions/1423357
复制相似问题