将数据从txt文件复制到c ++中的char指针

时间:2015-06-11 06:03:30

标签: c++ string pointers

我正在尝试获取指纹数据(我在另一个代码中创建并存储为文本文件),我必须在此代码中与新指纹进行比较。问题是指纹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);
                           ^

2 个答案:

答案 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来获取这样的指针。