【问题标题】:copy data from txt file to char pointer in c++将数据从txt文件复制到C++中的char指针
【发布时间】:2015-08-26 16:14:22
【问题描述】:

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

【问题讨论】:

  • 除非指纹 API 特别需要 malloc 分配的缓冲区,否则不要使用 malloc。除非指纹 api 特别想要一个持久字符缓冲区,否则只需使用std::string::c_str() 来获取字符指针(即使它确实需要一个持久缓冲区,也只需使用您不会修改的std::string,所以它不会t 移动缓冲区)。

标签: c++ string pointers


【解决方案1】:

顺便说一句,如果你只是阅读整个文件,你可以这样写:

#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++?

【讨论】:

    【解决方案2】:

    您实际上在代码中有 两个 错误,第一个是您在问题中显示的错误(在两个不同的地方是相同的错误),第二个错误更严重,将导致 undefined behavior .

    第一个错误是std::string 不是char*,所以你不能使用旧的C 函数。阅读this reference 应该会对您有所帮助。

    第二个问题是text_stream 是一个指向char 的指针,这意味着*text_stream 将为您提供text_stream 指向的内容,即单个chartext_stream[0]。这是有问题的,原因有两个:第一个是因为text_stream 未初始化,其内容是不确定的,并且取消引用不会为您提供导致未定义行为的有效指针。第二个问题是*text_stream 不是一个指针,分配给*text_stream 不会改变text_stream 所以text_stream仍然 在你覆盖一些随机内存时未初始化。如果编译器没有针对此分配向您发出警告,那么您需要启用更多警告。来自编译器的警告与编译器错误一样重要,它们通常表明您在哪些地方做了一些技术上没有错误但在运行程序时会导致其他问题的地方。

    解决这两个问题的方法是在 C++ 中停止使用 C 函数。独占使用std::string,当你需要调用一个需要const char *参数的函数时,只需使用std::string::c_str来获取这样的指针。

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2023-03-08
      • 2013-05-15
      • 1970-01-01
      • 2016-07-21
      • 2020-11-24
      相关资源
      最近更新 更多