2011-09-18 36 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