WriteFile 奇怪的現象

sun發表於2023-03-14

專案中有個需求是要對文字內容檢索並重寫,我們使用的是 WriteFile 覆蓋舊的文字內容

最小示例:

#include <Windows.h>

#include <iostream>

int main() {
  HANDLE hFile = CreateFile(L"File.txt",            // Open File.txt.
                            GENERIC_WRITE,          // Open for writing
                            0,                      // Do not share
                            NULL,                   // No security
                            OPEN_ALWAYS,            // Open or create
                            FILE_ATTRIBUTE_NORMAL,  // Normal file
                            NULL);                  // No template file
  const char str[] = "hello\r\r\nworld";
  DWORD written = 0;
  if (WriteFile(hFile, str, strlen(str) + 1, &written, NULL)) {
    printf("write success");
  }

  return 0;
}

上面輸出的 File.txt 裡有 hello world 字串,咋一看沒什麼異常,直到檢索的字串變多,才發現原先的每行字串都被插入一行空行,並且文字編碼變成 Macintosh(CR)

 

查閱相關文件才知道,\r 在 Macintosh 編碼格式下被認為是換行

一般的文字編碼是 Windows(CRLF),如下所示

 

 

Windows(CRLF) 是 windows 裡常見格式, 採用回車+換行 CR/LF 表示下一行,而 Macintosh(CR) 是使用回車表示下一行

這就導致每行文字都被新的空行填充

這裡我想說的是,WriteFile 似乎可以根據文字的內容,特別是跳脫字元自動改變文字換行格式

我們在後面相關文字修改的需求中要對這一改變有所注意,我個人感覺這是個小坑,故記錄一下

 

相關文章