項目中有個需求是要對文本內容檢索並重寫,我們使用的是 WriteFile 覆蓋舊的文本內容 最小示例: #include <Windows.h> #include <iostream> int main() { HANDLE hFile = CreateFile(L"File.txt", // Op ...
項目中有個需求是要對文本內容檢索並重寫,我們使用的是 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 似乎可以根據文本的內容,特別是轉義字元自動改變文本換行格式
我們在後面相關文本修改的需求中要對這一改變有所註意,我個人感覺這是個小坑,故記錄一下