C++ 从文本文件读取已创建的结构类型时遇到问题

C++ 从文本文件读取已创建的结构类型时遇到问题,c++,struct,ifstream,C++,Struct,Ifstream,我试图从一个.txt文件中读入信息,并将信息放入以前创建的结构类型中 以下是结构定义: struct String { const char* text; int sz; //length of string not including null terminator }; 这是给我错误的代码(这只是一个巨大的错误,最后它说“不能将‘title’转换为‘signed char*’” CDs* createCDs(const char* file_name) { ifstre

我试图从一个.txt文件中读入信息,并将信息放入以前创建的结构类型中

以下是结构定义:

struct String
{
   const char* text;
   int sz;  //length of string not including null terminator
};
这是给我错误的代码(这只是一个巨大的错误,最后它说“不能将‘title’转换为‘signed char*’”

CDs* createCDs(const char* file_name)
{
   ifstream input_file;
   input_file.open(file_name);

   String* artist;
   input_file >> artist;

   String* title;
   input_file >> title;

另外,正在读取的信息只是文本。任何帮助或输入都将不胜感激。

两个变量
artist
title
是指针,而不是对象。因此,如果您执行以下操作,您不会看到相同的行为:

String artist;
input_file >> artist;
当然,假设您有一个适当的
操作符>>()
(我会解释一下)

当您试图读入指针时,出现了一个错误,因为编译器找不到流提取操作符(
操作符>>()
)的重载,该操作符将指向
字符串的指针作为右手参数。您看到
的原因是无法将底部的“title”转换为类型“signed char*”
是因为编译器列出了所有候选重载以及它们在尝试将
artist
title
转换为其右侧参数时发出的相应错误


如果需要使用指针,则必须将其初始化为有效对象。并且必须取消对指针的引用,以获取指向该指针的对象的引用,以便流可以将数据读入其中:

String* artist = new String;
input_file >> *artist;
不过,这里实际上不需要指针。这可以通过将对象保留在堆栈上来实现:

String artist;
input_file >> artist;
如果出于某种原因,您仍然需要使用指针,则必须记住取消分配指针指向的内存(如果分配给使用
new
创建的数据)。您可以使用
delete
执行此操作:

// when you are finished using the data artist or title points to
delete artist;
delete title;
或者,您可以使用。a
std::unique\u ptr
是一个容器,当内存超出范围时,它将为您管理内存,因此您无需自行解除分配资源:

{
    std::unique_ptr<String> title;
    // ...
} // <= the resource held by title is released

如果提取器需要访问私有成员,则可以将其声明为类的朋友。

两个变量
artist
title
是指针,而不是对象。因此,如果执行以下操作,则不会看到相同的行为:

String artist;
input_file >> artist;
当然,假设您有一个适当的
操作符>>()
(我会解释一下)

当您试图读入指针时,出现了一个错误,因为编译器找不到流提取操作符(
操作符>>()
)的重载,该操作符将指向
字符串的指针作为右手参数。您看到的原因是
无法将底部的“title”转换为类型“signed char*”
是因为编译器列出了所有候选重载以及它们在尝试将
artist
title
转换为右侧参数时发出的相应错误


如果需要使用指针,则必须将其初始化为有效对象。并且必须取消对指针的引用,以获取指向该指针的对象的引用,以便流可以将数据读入其中:

String* artist = new String;
input_file >> *artist;
不过,这里实际上不需要指针。这可以通过将对象保留在堆栈上来实现:

String artist;
input_file >> artist;
如果出于某种原因,您仍然需要使用指针,则必须记住取消分配指针指向的内存(如果分配给使用
new
创建的数据)。您可以使用
delete
执行此操作:

// when you are finished using the data artist or title points to
delete artist;
delete title;
或者,您可以使用。a
std::unique\u ptr
是一个容器,当内存超出范围时,它将为您管理内存,因此您无需自行解除分配资源:

{
    std::unique_ptr<String> title;
    // ...
} // <= the resource held by title is released

如果提取器需要访问私有成员,则可以将其声明为类的朋友。

两个变量
artist
title
是指针,而不是对象。因此,如果执行以下操作,则不会看到相同的行为:

String artist;
input_file >> artist;
当然,假设您有一个适当的
操作符>>()
(我会解释一下)

当您试图读入指针时,出现了一个错误,因为编译器找不到流提取操作符(
操作符>>()
)的重载,该操作符将指向
字符串的指针作为右手参数。您看到的原因是
无法将底部的“title”转换为类型“signed char*”
是因为编译器列出了所有候选重载以及它们在尝试将
artist
title
转换为右侧参数时发出的相应错误


如果需要使用指针,则必须将其初始化为有效对象。并且必须取消对指针的引用,以获取指向该指针的对象的引用,以便流可以将数据读入其中:

String* artist = new String;
input_file >> *artist;
不过,这里实际上不需要指针。这可以通过将对象保留在堆栈上来实现:

String artist;
input_file >> artist;
如果出于某种原因,您仍然需要使用指针,则必须记住取消分配指针指向的内存(如果分配给使用
new
创建的数据)。您可以使用
delete
执行此操作:

// when you are finished using the data artist or title points to
delete artist;
delete title;
或者,您可以使用。a
std::unique\u ptr
是一个容器,当内存超出范围时,它将为您管理内存,因此您无需自行解除分配资源:

{
    std::unique_ptr<String> title;
    // ...
} // <= the resource held by title is released

如果提取器需要访问私有成员,则可以将其声明为类的朋友。

两个变量
artist
title
是指针,而不是对象。因此,如果执行以下操作,则不会看到相同的行为:

String artist;
input_file >> artist;
当然,假设您有一个适当的
操作符>>()
(我会解释一下)

当您试图读入指针时,出现了一个错误,因为