2015-06-11 24 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即可获得此类指针。