- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于一项学校作业,我必须使用 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/
我看到了其他 boost::lexical_cast 问题的一些答案,断言以下是可能的: bool b = boost::lexical_cast("true"); 这不适用于 g++ 4.4.3 b
我已经看到其他 boost::lexical_cast 问题的一些答案,这些问题断言以下是可能的: bool b = boost::lexical_cast("true"); 这不适用于 g++ 4.
boost::lexical_cast 在将字符串转换为 int8_t 时抛出异常,但 int32_t - 正常。 int8_t 有什么问题? #include #include #include
我正在尝试扩展 lexical_cast 以处理 string->cv::Point 转换,代码如下: #include #include #include #include #include
我在这个话题中看到C++ convert hex string to signed integer boost::lexical_cast 可以将字符串中的十六进制转换为另一种类型(int、long.
我想扩展 lexical_cast vector 的方法类型,但它不起作用。我尝试了以下代码: #include namespace boost { template <> inli
我是 boost::lexical_cast 的新手,对其内部结构了解甚少。我正在尝试进行以下转换: string someString = boost::lexical_cast(sourceStr
我正在尝试构建一个将程序设置存储为 std::map 的类。由于所有程序设置都存储为字符串,因此我想要一个可以返回转换为相关类型的程序设置的访问器方法。我刚接触 C++ 模板,这是我的第一次尝试: c
我在两个不同的设备上有相同版本的 boost ,但行为不同 lexical_cast("-1") 文档指出它应该给我 INT_MAX(2 的补码翻转)但是在一台机器上我得到一个异常抛出而在另一台机器上
我有一个(也许)关于复合类型的 boost::lexical_cast 的简单问题(在我的例子中是 std::vector。 我的第一个模板化字符串化函数版本如下 template std::str
我遇到了转换问题,希望得到您的帮助。我正在使用 gcc4 编译器,但我对 gcc4 的使用非常有限。 我想将 std::string 转换为 double。 std::string aQuantity
我有一种情况,我正在获取命令行参数并使用 boost::lexical_cast(my_param) .我希望 my_param 的负值会导致 lexical_cast 抛出,但它会愉快地转换它们,-
我正在使用 boost::lexical_cast(double)用于将 double 转换为字符串,生成 JSON 序列化字节流,即(在远程端)由 .NET 解析。 我能够强制 .NET 使用 In
我实际上没能在 boost 文档中找到这个问题的答案。我对在多线程环境中使用 atof 有点偏执,所以一个建议是用 lexical_cast 替换调用。 lexical_cast 是线程安全的吗? 最
我正在为 C++ 使用 boost 库,函数 lexical_cast 的行为非常奇怪。如果我执行 lexical_cast("0.07513994") 它工作正常,但如果我使用我需要转换的变量,它会
编译以下内容: // file main.cpp #include #include int main() { boost::lexical_cast( 656.16 ); ret
以 bool 变量作为输入的 boost::lexical_cast 的输出预计为 0 或 1 值(value)。但是我得到了不同的值。 这不是正常发生的事情。让我们看一下我编写的示例代码: #inc
我查看了 lexical_cast.hpp 的困惑情况,但它仍然让我无法理解。 lexical_cast 的“基本定义”采用模板源和目标,如何能够接受诸如 lexical_cast("7") 之类的语
我正在参加一项挑战,为了切入主题,在我的程序中的一个地方,我需要将字符串转换为整数。我试过 boost::lexical_cast 但不幸的是它太慢了www。我想是因为它执行的所有检查。我需要的是无需
忽略 boost::lexical_cast 的异常是否安全?将 int 转换为 std::string 时? 最佳答案 将 int 转换为 std::string 时词法转换引发的异常与转换无关,但
我是一名优秀的程序员,十分优秀!