Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 写入共享内存_C++_File_Winapi_Shared Memory - Fatal编程技术网

C++ 写入共享内存

C++ 写入共享内存,c++,file,winapi,shared-memory,C++,File,Winapi,Shared Memory,如何使用Win32 API将文件写入共享内存 我有以下代码: 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, TE

如何使用Win32 API将文件写入共享内存

我有以下代码:

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);
hFile=CreateFile(“input.map”,
一般的读,一般的写,
文件共享读取,
无效的
永远敞开心扉,
文件\u属性\u正常,
无效);
hMapFile=CreateFileMapping(hFile,
无效的
第页读写,
0,
0,
文本(“共享对象”);
lpMapAddress=(LPTSTR)MapViewOfFile(hMapFile,
文件\u映射\u所有\u访问,
0,
0,
0);
读取文件(
hFile,
lpMapAddress,
75,
&拜特斯拉德,
无效);
sprintf((char*)lpMapAddress,“”);
printf((char*)lpMapAddress);
但是,printf调用只返回“”而不返回文件的内容

编辑:
发现了问题。当我调用sprintf时,我正在写入输入文件。但我仍然不知道为什么…

这是整个代码示例吗?在我看来,调用
sprintf
会在
lpMapAddress
处放置一个以null结尾的字符串,这会有效地覆盖从文件中读取的内容——至少在
printf
语句中是这样

如果要用字符串
”替换阅读内容的第一部分,可以在阅读文件后执行此操作:

char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));
char*tmp=”“;
strncpy((char*)lpMapAddress,tmp,strlen(tmp));

复制字符串的文本,但不复制其空终止符。

这是整个代码示例吗?在我看来,调用
sprintf
会在
lpMapAddress
处放置一个以null结尾的字符串,这会有效地覆盖从文件中读取的内容——至少在
printf
语句中是这样

如果要用字符串
”替换阅读内容的第一部分,可以在阅读文件后执行此操作:

char *tmp = "<output 1>";
strncpy((char*)lpMapAddress, tmp, strlen(tmp));
char*tmp=”“;
strncpy((char*)lpMapAddress,tmp,strlen(tmp));

它复制字符串的文本,但不复制其空终止符。

sprintf在
之后存储NUL,并且
printf
在第一个NUL处停止

(另外,将一些随机文件作为格式传递给
printf
是个坏主意。如果它包含
%
字符怎么办?但这是另一个问题。)

我正在写入输入文件时 给斯普林特打电话。但我还是不知道 为什么


因为这就是
MapViewOfFile
所做的。它将文件内容与内存块相关联。文件的当前内容显示在内存块中,您对该内存所做的任何更改都会写入该文件。

sprintf在
之后存储NUL,
printf
在第一个NUL处停止

(另外,将一些随机文件作为格式传递给
printf
是个坏主意。如果它包含
%
字符怎么办?但这是另一个问题。)

我正在写入输入文件时 给斯普林特打电话。但我还是不知道 为什么


因为这就是
MapViewOfFile
所做的。它将文件内容与内存块相关联。文件的当前内容显示在内存块中,您对该内存所做的任何更改都会写入该文件。

我真的不明白您在这里得到了什么。不管你之前写了什么代码;最后一行总是返回您在前一行“sprintf”中放入缓冲区的字符串。因为那是“
”,是的,那就是将要返回的内容。

我真的不明白你在这里得到了什么。不管你之前写了什么代码;最后一行总是返回您在前一行“sprintf”中放入缓冲区的字符串。因为这是“
”,所以是的,这就是将返回的内容。

我认为映射后不需要调用ReadFile。只需从lpMapAddress访问内容


但是,使用内存文件映射对MapViewOfFile使用常量没有任何好处。

我认为映射后不需要调用ReadFile。只需从lpMapAddress访问内容

但是,使用内存文件映射对MapViewOfFile使用常量没有任何好处。

这很有帮助!最后使用了strcat()。这很有帮助!最后使用了strcat()。