gpt4 book ai didi

c++ - 通过 boost::lexical_cast 将 C++Builder AnsiString 转换为 std::string

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:33 37 4
gpt4 key购买 nike

对于一项学校作业,我必须使用 Borland C++ Builder 用 C++ 实现一个项目。

由于 VCL 对所有 GUI 组件使用 AnsiString,为了显示,我必须将所有 std::string 转换为 AnsiString。

std::string inp = "Hello world!";
AnsiString outp(inp.c_str());

当然可以,但是编写起来有点乏味,我想避免代码重复。当我们在其他上下文中使用 Boost 时,我决定提供一些辅助函数 go get boost::lexical_cast 以与 AnsiString 一起工作。到目前为止,这是我的实现:

std::istream& operator>>(std::istream& istr, AnsiString& str) {
istr.exceptions(std::ios::badbit | std::ios::failbit | std::ios::eofbit);
std::string s;
std::getline(istr,s);
str = AnsiString(s.c_str());
return istr;
}

一开始我在访问冲突后得到了访问冲突,但自从我添加了 .exceptions() 内容后,图片变得更清晰了。执行转换时,出现以下异常:

ios_base::eofbit set [Runtime Error/std::ios_base::failure]

有没有人知道如何修复它并且可以解释为什么会发生错误?我的 C++ 经验非常有限。

相反的转换例程是:

std::ostream& operator<<(std::ostream& ostr,const AnsiString& str) {
ostr << (str.c_str());
return ostr;
}

也许有人也会在这里发现错误:)

致以最诚挚的问候!

编辑:

目前我使用的是 Jem 的编辑版本,它一开始就可以使用。在使用该程序一段时间后,Borland Codeguard 在已经释放的区域中提到了一些指针算法。知道这之间有什么关系吗?

Codeguard 日志(我使用的是德文版本,翻译标有星号):

------------------------------------------
Fehler 00080. 0x104230 (r) (Thread 0x07A4):
Zeigerarithmetik in freigegebenem Speicher: 0x0241A238-0x0241A258. **(pointer arithmetic in freed region)**
| d:\program files\borland\bds\4.0\include\dinkumware\sstream Zeile 126:
| { // not first growth, adjust pointers
| _Seekhigh = _Seekhigh - _Mysb::eback() + _Ptr;
|> _Mysb::setp(_Mysb::pbase() - _Mysb::eback() + _Ptr,
| _Mysb::pptr() - _Mysb::eback() + _Ptr, _Ptr + _Newsize);
| if (_Mystate & _Noread)
Aufrufhierarchie: **(stack-trace)**
0x00411731(=FOSChampion.exe:0x01:010731) d:\program files\borland\bds\4.0\include\dinkumware\sstream#126
0x00411183(=FOSChampion.exe:0x01:010183) d:\program files\borland\bds\4.0\include\dinkumware\streambuf#465
0x0040933D(=FOSChampion.exe:0x01:00833D) d:\program files\borland\bds\4.0\include\dinkumware\streambuf#151
0x00405988(=FOSChampion.exe:0x01:004988) d:\program files\borland\bds\4.0\include\dinkumware\ostream#679
0x00405759(=FOSChampion.exe:0x01:004759) D:\Projekte\Schule\foschamp\src\Server\Ansistringkonverter.h#31
0x004080C9(=FOSChampion.exe:0x01:0070C9) D:\Projekte\Schule\foschamp\lib\boost_1_34_1\boost/lexical_cast.hpp#151

Objekt (0x0241A238) [Größe: 32 Byte] war erstellt mit new **(Object was created with new)**
| d:\program files\borland\bds\4.0\include\dinkumware\xmemory Zeile 28:
| _Ty _FARQ *_Allocate(_SIZT _Count, _Ty _FARQ *)
| { // allocate storage for _Count elements of type _Ty
|> return ((_Ty _FARQ *)::operator new(_Count * sizeof (_Ty)));
| }
|
Aufrufhierarchie: **(stack-trace)**
0x0040ED90(=FOSChampion.exe:0x01:00DD90) d:\program files\borland\bds\4.0\include\dinkumware\xmemory#28
0x0040E194(=FOSChampion.exe:0x01:00D194) d:\program files\borland\bds\4.0\include\dinkumware\xmemory#143
0x004115CF(=FOSChampion.exe:0x01:0105CF) d:\program files\borland\bds\4.0\include\dinkumware\sstream#105
0x00411183(=FOSChampion.exe:0x01:010183) d:\program files\borland\bds\4.0\include\dinkumware\streambuf#465
0x0040933D(=FOSChampion.exe:0x01:00833D) d:\program files\borland\bds\4.0\include\dinkumware\streambuf#151
0x00405988(=FOSChampion.exe:0x01:004988) d:\program files\borland\bds\4.0\include\dinkumware\ostream#679

Objekt (0x0241A238) war Gelöscht mit delete **(Object was deleted with delete)**
| d:\program files\borland\bds\4.0\include\dinkumware\xmemory Zeile 138:
| void deallocate(pointer _Ptr, size_type)
| { // deallocate object at _Ptr, ignore size
|> ::operator delete(_Ptr);
| }
|
Aufrufhierarchie: **(stack-trace)**
0x004044C6(=FOSChampion.exe:0x01:0034C6) d:\program files\borland\bds\4.0\include\dinkumware\xmemory#138
0x00411628(=FOSChampion.exe:0x01:010628) d:\program files\borland\bds\4.0\include\dinkumware\sstream#111
0x00411183(=FOSChampion.exe:0x01:010183) d:\program files\borland\bds\4.0\include\dinkumware\streambuf#465
0x0040933D(=FOSChampion.exe:0x01:00833D) d:\program files\borland\bds\4.0\include\dinkumware\streambuf#151
0x00405988(=FOSChampion.exe:0x01:004988) d:\program files\borland\bds\4.0\include\dinkumware\ostream#679
0x00405759(=FOSChampion.exe:0x01:004759) D:\Projekte\Schule\foschamp\src\Server\Ansistringkonverter.h#31

------------------------------------------

Ansistringkonverter.h 是包含已发布运算符的文件,第 31 行是:

std::ostream& operator<<(std::ostream& ostr,const AnsiString& str) {
ostr << (str.c_str()); **(31)**
return ostr;
}

感谢您的帮助:)

最佳答案

仍然没有使用 boost,但可能是解决您当前问题的第一步。你可以试试这个:

std::istream& operator>>(std::istream& istr, AnsiString& str) {
istr.exceptions(std::ios::badbit | std::ios::failbit | std::ios::eofbit);
std::string s;
istr >> s;
str = AnsiString(s.c_str());
return istr;
}

编辑:更完整的解决方案,考虑了 op 的评论:

std::istream& operator>> (std::istream& istr, AnsiString& str) 
{
std::string tmp;

std::istreambuf_iterator<char> it(istr), end;
std::copy(it, end, std::inserter(tmp, tmp.begin()));

str = AnsiString(tmp.c_str());

return istr;
}

但是,std::string 和 AnsiString 具有不同的 operator >> 行为可能可以满足您的需求,但通常不是很好。您仍然可以给它一个明确的名称。

关于c++ - 通过 boost::lexical_cast 将 C++Builder AnsiString 转换为 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/898209/

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