使用CreateFileMapping()函数将长度未知的文本写入文件

4

我希望能将文字写入文件。但是,由于文本长度未知,所以我无法确定映射内存的大小,并将其设置为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);
}

2
SetFilePointer(hFile2, strlen(chp), 0, 0); SetEndOfFile(hFile2);它有效! - Mackerel
这是因为在我的程序中,使用文件指针进行文件写入太慢了。@immibis - Mackerel
我想丢弃NULL :) @JosephQuinsey - Mackerel
1
@Mackerel:看起来使用WriteFile比使用映射概率上不会明显变慢。我强烈怀疑你的测量方法不正确。 - Harry Johnston
@HarryJohnston 然后,我必须再次检查它。谢谢 - Mackerel
显示剩余5条评论
1个回答

3

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

因此,要截断文件:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接