将数据从 TXT 文件复制到 C++ 中的字符指针
copy data from txt file to char pointer in c++
我正在尝试获取指纹数据(我创建并作为文本文件存储在另一个代码中),我必须将其与该代码中的新指纹进行比较。问题是指纹 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
指向的东西,即单个char
或text_stream[0]
。这是有问题的,原因有两个:第一个原因是text_stream
未初始化,其内容不确定,取消引用不会为您提供导致未定义行为的有效指针。第二个问题是*text_stream
不是指针,分配给*text_stream
不会改变text_stream
因此text_stream
覆盖一些随机内存时仍然未初始化。如果编译器没有为此作业向你发出警告,那么你需要启用更多警告。来自编译器的警告与编译器错误一样重要,它们通常指示您执行的操作在技术上没有错误,但在运行程序时会导致其他问题。
这两个问题的解决方案是在C++中停止使用 C 函数。只使用 std::string
,当你需要调用一个需要const char *
参数的函数时,只需使用 std::string::c_str
来获取这样的指针。
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存