[英]copy data from txt file to char pointer in c++
我試圖獲取指紋數據(我創建並存儲為另一個代碼中的文本文件),我必須與此代碼中的新指紋進行比較。 問題是指紋API要求指紋數據作為char指針傳遞。 我正在使用以下代碼:
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);
^
順便說一句,如果你只是閱讀整個文件,你可以這樣寫:
#include <string>
#include <fstream>
#include <streambuf>
std::ifstream t("timestamp.txt");
std::string str((std::istreambuf_iterator<char>(t)),
std::istreambuf_iterator<char>());
(如果你關心上面代碼的效率,這里有一個更高效的版本:將整個ASCII文件讀入C ++ std :: string )
這樣,您不需要自己創建顯式字符串緩沖區。 之后,您可以使用str.c_str()來獲取“const char *”。
使用它時,請注意,如果繼續編輯字符串,結果指針可能無效。 在這種情況下,您可能需要創建該字符串的另一個副本。 如果你的函數需要一個“char *”而不是“const char *”,你可能也需要這樣做。 更多信息可以在這里找到: 如何在C ++中將字符串轉換為char數組?
實際上你在代碼中有兩個錯誤,首先是你在問題中顯示的錯誤(在兩個不同的地方是相同的錯誤),第二個錯誤更糟,會導致未定義的行為 。
第一個錯誤是std::string
不是char*
,因此你不能使用舊的C函數。 閱讀此參考資料應該對您有所幫助。
第二個問題是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
來獲取這樣的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.