gpt4 book ai didi

c - fwprintf 将回车符放在换行符之前

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:31 24 4
gpt4 key购买 nike

我的 WinAPI 程序旨在从 Edit control 中获取文本并将其保存到文件中。

fopen 以文本模式 "w" 创建文件时,然后 fprintf 使换行符 LF 字符前面有回车符 CR .

HWND hEdit = CreateWindowA( "Edit", NULL, WS_CHILD|ES_MULTILINE, 0, 0, 100, 100, 
hWnd, (HMENU)ID_EDITORE, GetModuleHandle(NULL), NULL );
// Input in Edit control a single line break "\r\n"
int num = GetWindowTextLength(hEdit);
char buffer[num+1];
GetWindowText( hEdit, buffer, num+1 );
FILE* file = fopen( "test.txt", "w" );
fprintf( file, "%s", buffer );

上面的代码并没有在文件中写入CR LF,而是:

CR CR LF (0D 0D 0A)

我知道在 ANSI 版本中,解决方案是以二进制模式打开文件:"wb" 而不是 "w",这样就没有 CR LF 输出时发生翻译或字符转换。

但是我想在Edit控件中输入Unicode字符,并且将文件编码为UTF-8和BOM。
那么宽字符版本 _wfopenfwprintf 呢?

HWND hEdit = CreateWindowW( L"Edit", ... );
// Input in Edit control a single line break "\r\n"
int num = GetWindowTextLength(hEdit);
wchar_t buffer[num+1];
GetWindowTextW( hEdit, buffer, num+1);
FILE* file = _wfopen( L"test.txt", L"w,ccs=UTF-8" );
fwprintf( file, L"%s", buffer );

上面的代码没有写ï » ¿ CR LF in文件,但是:

ï » ¿ CR CR LF (EF BB BF 0D 0D 0A)

这里无法使用"b" 二进制模式来避免添加CR

FILE* file = _wfopen( L"test.txt", L"wb,ccs=UTF-8" );

在文件中写入预期的 \r\n 但编码为 UTF-16,没有任何 BOM:

CR NUL LF NUL (0D 00 0A 00)

如何避免 UTF-8 文件的这种CR 扩散?
我是否被迫将其编码为 UTF-16?

感谢任何建议。

最佳答案

如建议的那样,一个可能的解决方案是在将 buffer 写入文件之前删除所有 CR
然后 fwprintf 关心在每个 LF 之前放置一个 CR 恢复对 \r\n

HWND hEdit = CreateWindowW( L"Edit", ... );
int num = GetWindowTextLength(hEdit);
wchar_t buffer[num+1];
GetWindowTextW( hEdit, buffer, num+1 );

for( int i=0, id=0; id<=num; i++, id++ ) {
while( buffer[id]=='\r' )
id++;
buffer[i] = buffer[id];
}

FILE* file = fopen( "test.txt", "w,ccs=UTF-8" );
fwprintf( file, L"%s", buffer );
fclose(file);

关于c - fwprintf 将回车符放在换行符之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41616732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com