将数据从 TXT 文件复制到 C++ 中的字符指针

copy data from txt file to char pointer in c++

本文关键字:C++ 字符 指针 复制 数据 TXT 文件      更新时间:2023-10-16

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

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

#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++中将字符串转换为字符数组?

您实际上在代码中有两个错误,第一个是您在问题中显示的错误(在两个不同的地方是相同的错误),第二个错误更糟,会导致未定义的行为

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

第二个问题是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 来获取这样的指针。