我正在尝试获取指纹数据(我在另一个代码中创建并存储为文本文件),我必须在此代码中与新指纹进行比较。问题是指纹API要求指纹数据作为字符指针传递。我使用以下代码:
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 :(得分: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()来获取&#34; const char *&#34;。
使用它时,请注意,如果继续编辑字符串,结果指针可能无效。在这种情况下,您可能需要创建该字符串的另一个副本。如果你的功能需要一个&#34; char *&#34;而不是&#34; const char *&#34;,您可能也需要这样做。可以在此处找到更多信息:How to convert string to char array in C++?
答案 1 :(得分:1)
你实际上在代码中有两个错误,首先是你在问题中显示的错误(在两个不同的地方是相同的错误),第二个错误更糟,将导致{{3 }}
第一个错误是undefined behavior不是char*
,因此您无法使用旧的C函数。阅读std::string
应该会对你有所帮助。
第二个问题是text_stream
是指向char
的指针,意味着*text_stream
将为您提供text_stream
指向的内容,即单个char
,或text_stream[0]
。这是有问题的,原因有两个:第一个因为text_stream
未初始化,其内容是不确定的,并且解除引用不会为您提供导致未定义行为的有效指针。第二个问题是*text_stream
不是指针,分配给*text_stream
不会更改text_stream
因此text_stream
仍然未初始化你覆盖了一些随机记忆。如果编译器没有为此分配向您发出警告,则需要启用更多警告。编译器的警告和编译器错误一样重要,它们通常表示你做的事情在技术上是错误的,但在运行程序时会导致其他问题。
解决这两个问题的方法是停止在C ++中使用C函数。完全使用this reference,当需要调用需要const char *
参数的函数时,只需使用std::string
来获取这样的指针。