2011-09-18 37 views
0

分配:转换/解析指向字符串和双打

  1. 阅读从文本文件(完成)信息

  2. 使用SUBSTR法(完成)

  3. 检索的文本文件只有部分将信息存储到实例变量中(需要帮助)

这里我就是我我遇到的麻烦的代码:

string* lati; 
lati = new string(data.substr(0, data.find_first_of(","))); 

double* latDub; 
latDub = new double(atof((char *)lati)); 

this->latitude = *latDub; 
  1. 我需要纬度存储到实例变量latitude

  2. 变量data是读入的文本文件。

  3. this->latitude被声明为double

我已经测试和变量lati是正确的值,但一旦我尝试将其转换成double的值更改为0出于某种原因。在转换时我特意使用atof方法!

+0

为什么你这么用'new'?为什么使用'new'来分配所有东西的'std :: string'和**'double' **? –

+0

@尼科尔:可能是因为他被所谓的“纯粹的”OO语言所毒化,所有这些都是“新鲜的”。 – sbi

+1

Logan,在C++中是无意义的代码。你很少在C++中使用'new'数据,当你这样做时,它应该隐藏在一些非动态变量中。 – sbi

回答

2

(char *)lati不符合您的想法。你显然想要做的是得到与拉蒂相关的char序列,但是你实际上只是将string*压缩成char*,这是各种不好的。

std :: string上有一个成员函数,它可以准确地给你想要的东西。您应该查看字符串的文档,并用该函数的调用替换(char *)lati

+0

非常感谢!这个学者和绅士所指的成员函数是data()操作,它返回一个char *,这确实正是我想要的。 – logeyg

+0

@Logan - 实际上,你需要'c_str()',而不是'data()',但你离得很近。 data()在实际中可能适用于你,但在技术上是不正确的,因为它不能保证是一个以null结尾的'char'序列,这是atof()所要查找的。你应该阅读这两个函数,这样你才能更好地理解我的意思。 – adpalumbo

0

为什么你的代码编译,但给无意义的结果已经explained by adpalumbo。您的代码中存在导致该错误的两个基本问题,我想在此处进行扩展。

一个是你使用C风格演员:(T)obj。基本上,这只是告诉编译器闭嘴,你知道你在做什么。这绝非一个好主意,因为当你知道自己在做什么时,通常可以不用这样的演员。

另一个问题是您正在使用在堆上动态分配的对象。在C++中,应该在堆栈上创建对象,除非您有充分理由使用动态对象。动态对象通常隐藏在堆栈中的对象内。所以,你的代码应该这样写:

string lati(data.substr(0, data.find_first_of(","))); 
double latDub = /* somehow create double from lati */; 
this->latitude = latDub; 

当然,latDub是完全没有必要的,你也可以同样写this->latitude直接。

现在,将字符串转换为其他类型的常用方法是通过字符串流进行流式处理。删除您介绍了不必要的变数,您的代码会再看看这样的:

std::istringstream iss(data.substr(0, data.find_first_of(","))); 
if(!iss >> this->latitude) throw "Dude, you need error handling here!"; 

通常要打包从一个字符串转换成一个实用的功能,你可以在你的代码重用:

inline double convert3double(const std::string& str) 
{ 
    std::istringstream iss(str); 
    double result; 
    if(!iss >> result) 
    throw std::exception("Dang!"); 
    return result; 
} 

然而,由于非常相同的算法,可用于所有类型(其operator>>与输入流作为左操作数有意义过载),只是使之成为一个模板:

template< typename T > 
inline T convert3double(const std::string& str) 
{ 
    std::istringstream iss(str); 
    T result;    // presumes default constructor 
    if(!iss >> result) // presumes operator>> 
    throw std::exception("Dang!"); 
    return result; 
} 
+0

哇。非常感谢..非常有用的信息。我只是在学校开办了一个C++课程,所以我认为如果我采用这样的解决方案,教授会非常惊讶,哈哈。再次感谢,这增加了我对C++的新理解。 – logeyg

+0

@Logan:不客气。不过,我可能会补充一点:你需要一本[很好的C++书](http://stackoverflow.com/q/388242/140719)来真正学习C++。 – sbi