【问题标题】:windows api richtextbox adding extra linebreak in c++windows api richtextbox在c ++中添加额外的换行符
【发布时间】:2013-12-15 17:41:38
【问题描述】:

我正在 c++ windows api 中制作一个十六进制编辑器

我有一个丰富的文本框,我可以很好地阅读文件。问题是当我写回文件时,richtextbox 添加了某种换行符或其他东西,因此文件不会输出相同的内容。我使用消息框来查看特殊字符是什么,它似乎是某种换行符,因为它会在消息框中显示我的十六进制字节,然后在插入特殊字符的部分它将显示我的十六进制字节稍高的消息框。大约 6 个月前,我在一个汇编程序中遇到了这个问题,并且能够通过删除所有十六进制字节“13”来解决它,因为它们在汇编中没有“\n”。所以我尝试删除“\n”但它没有用,我还尝试删除“\t”、“\f”、“\r”、“\n\r”、“\r\n”和那些也不要删除它。这是我用来尝试删除特殊字符的代码(我在堆栈溢出时发现它,它似乎有效,所以我不认为这是代码错误)

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());

我什至试着写一个函数,如果你找到任何“\n”、“\t”、“\f”、“\r”、“\n\r”、“\r\n”消息框我,但它从来没有给我留言,所以它是其他一些特殊字符。

有人可以帮我弄清楚特殊字符是什么,以便我可以删除它

谢谢

这里的更新是如何从 windows 中的 Richtextbox 中删除换行符

您必须删除 '\r\n' 和 '\n' 所以这里是将 Richtextbox 的内容读入字符串并删除换行符的代码

textboxlength = GetWindowTextLength(hwndtextbox1);
GetWindowText(hwndtextbox1, buffert, textboxlength);
buffer4 = buffert;
                                          buffer4.erase(std::remove(buffer4.begin(), buffer4.end(), L'\r\n'), buffer4.end());
                                          buffer4.erase(std::remove(buffer4.begin(), buffer4.end(), L'\n'), buffer4.end());

textboxlength 是 LONGLONG,buffer 是 TCHAR,buffer4 是 wstring

【问题讨论】:

  • '\r\n' 是一个多字符文字,其行为没有明确定义,所以我认为实际上你只是在运行两个搜索,一个用于 '\r',第二个用于'\n'。没有错,但效率低下。我会在我的答案中添加一些代码,你可以试试。

标签: c++ windows winforms winapi


【解决方案1】:

Windows 使用 CR+LF 作为标准换行标记 - 即两个单独的字符在一起 - ASCII 13 后跟 ASCII 10。一个或另一个本身通常不会被识别为换行符。

编辑:这是从std::string 中删除CR+LF 的示例函数:

std::string RemoveLinebreak(std::string input)
{
    const std::string newline("\r\n");
    size_t pos = 0;
    while((pos = input.find(newline, pos)) != std::string::npos) {
         input.erase(pos, newline.length());
    }
    return input;
}

【讨论】:

  • 我尝试寻找“\r\n”和“\n\r”,但没有找到。这就是我寻找 CR+LF 的方式
  • 我使用 GetwindowsText 将文本读入 TCHAR,然后将 TCHAR 转换为 wstring,然后尝试删除 "\n\r" 这是代码----- GetWindowText(hwndtextbox1,缓冲,10000000); buffer4 = buffert;buffer4.erase(std::remove(buffer4.begin(), buffer4.end(), '\n\r'), buffer4.end());
【解决方案2】:

对于 wchar '\n' 是 L'\n' 而 '\n' 是 L'\n'

所以基本上你应该使用

std::wstring str

str.erase(std::remove(str.begin(), str.end(), 'L\n'), str.end());

std::wstring str;

int pos;

pos=str.find_first_of(Text("\n\r")); if(pos!=std::wstring::nops)str.erase(pos,pos+1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多