CreateFileMapping() 用于将长度未知的文本写入文件

标签 c windows file-mapping

我想将文本写入文件。文本长度未知。所以想不出设置要使用的mapped memory的大小,就设置为100。然后,问题出现了!字符串写入成功,但剩余的100字节空间被NULL填满!!我怎样才能避免它???

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <assert.h>

void main()
{
    HANDLE hFile2 = CreateFile("hi.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    assert(hFile2 != INVALID_HANDLE_VALUE);

    // mapping..
    HANDLE hMapping2 = CreateFileMapping(hFile2, NULL, PAGE_READWRITE, 0, 100, NULL);
    assert(hMapping2 != NULL);

    void* p2;
    p2 = MapViewOfFile(hMapping2, FILE_MAP_WRITE, 0, 0, 0);
    assert(p2 != NULL);

    char *chp;
    if(rand() % 2)
        chp = "yeah!!";
    else
        chp = "good";
    // copy
    memcpy(p2, chp, strlen(chp));

    // close
    UnmapViewOfFile(p2);
    CloseHandle(hMapping2);
    CloseHandle(hFile2);
}

最佳答案

函数SetEndOfFile会将物理文件大小设置为文件指针的当前位置。和 SetFilePointer将设置文件指针。

因此要截断文件:

   CloseHandle(hMapping2); // do first
   SetFilePointer(hFile2, strlen(chp), 0, 0);
   SetEndOfFile(hFile2); 

关于CreateFileMapping() 用于将长度未知的文本写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27736985/

相关文章:

java - 在 Java 中使用并发在磁盘上创建键值存储

c++ - Visual C++6 MFC MapViewOfFile 返回错误代码 8

c - 用 C 直接读写压缩文件

c - c 中的 TCP 聊天无法正确读取/发送字符串

c - 语法错误;意外符号 :

objective-c - 我应该在哪个文件夹中放置一个文件作为 xcode 4 中的命令行参数传递?

c++ - Qt QPSQL驱动问题

windows - 我可以将辅助角色部署到 Windows azure pack 吗?

java - 使用 ArrayList 对象时,Windows 上的 Netbeans 6.9.1 无法运行并出现以下错误

c++ - 循环文件映射会降低性能