2015-06-11 72 views
1

我想獲取指紋數據(我創建和存儲爲另一個代碼中的文本文件),我必須與此代碼中的新指紋進行比較。問題在於指紋API需要將指紋數據傳遞爲字符指針。我使用下面的代碼:從txt文件複製數據到字符指針在c + +

std::ifstream infile("timestamp.txt"); 

char* text_stream; 
std::string line; 

    if (infile.is_open()){ 
    while (getline (infile,line)){ 
     if(text_stream){ 
      *text_stream = malloc (1 + strlen (line)); 
      strcpy(text_stream,line); 
     } 
     else{ 
      fprintf (stderr, "malloc failure!"); 
     } 
    } 
    infile.close(); 
    } 

我一直在使用其他代碼爲同一目的也試過,但我得到這樣的編譯錯誤,每次的:

verifiy.cpp: In function ‘int main()’: 
verifiy.cpp:29:47: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘const char*’ for argument ‘1’ to ‘size_t strlen(const char*)’ 
    *text_stream = malloc (1 + strlen (line)); 
             ^
verifiy.cpp:30:31: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘const char*’ for argument ‘2’ to ‘char* strcpy(char*, const char*)’ 
    strcpy(text_stream,line); 
         ^
+0

除非指紋API特別需要'malloc'分配的緩衝區,否則不要使用'malloc'。除非指紋API特別需要一個持久性字符緩衝區,只要使用'std :: string :: c_str()'來獲取char指針(即使它需要一個持久緩衝區,那麼只需使用一個「std :: string」你不會修改它,所以它不會移動緩衝區)。 – hyde

回答

2

順便說一句,如果你只是讀取整個文件,你可以寫這樣的事情:

#include <string> 
#include <fstream> 
#include <streambuf> 

std::ifstream t("timestamp.txt"); 
std::string str((std::istreambuf_iterator<char>(t)), 
       std::istreambuf_iterator<char>()); 

(如果你關心上面的代碼的效率,還有一個更有效的版本,在這裏:Read whole ASCII file into C++ std::string

這樣,您不需要自己創建顯式字符串緩衝區。之後,你可以使用str.c_str()來獲得「const char *」。

使用時請注意,如果您不斷編輯字符串,則生成的指針可能無效。在這種情況下,您可能需要製作另一個字符串副本。如果你的函數需要一個「char *」而不是「const char *」,你可能也需要這樣做。更多信息可以在這裏找到:How to convert string to char array in C++?

1

你確實有代碼中的錯誤,首先是您在問題中顯示的錯誤(這是兩個不同位置的錯誤),第二個錯誤會更糟,並且會導致undefined behavior

第一個錯誤是std::string不是char*,所以你不能使用它的舊C函數。閱讀this reference應該會幫助你一點。

的第二個問題是text_stream是一個指向char,意思*text_stream會給你什麼text_stream點,即單次char,或text_stream[0]。這是有問題的,因爲兩個原因:第一個是因爲text_stream未初始化,其內容是不確定的,並且取消引用不會爲您提供導致未定義的行爲的有效指針。第二個問題是,*text_stream不是指針,分配給*text_stream不會改變text_stream所以text_stream仍然在覆蓋某些隨機存儲器時未初始化。如果編譯器沒有針對此任務發出警告,則需要啓用更多警告。編譯器的警告與編譯器錯誤一樣重要,它們通常會指示您執行某些技術上不正確的事情,但在運行該程序時會導致其他問題。

解決這兩個問題的辦法是到停止在C++中使用C函數。僅使用std::string,並且當您需要調用需要參數const char *的函數時,只需使用std::string::c_str即可獲得此類指針。