无法从文本文件中读取已创建的结构类型

时间:2014-04-30 19:56:34

标签: c++ struct ifstream

我正在尝试从.txt文件读取信息并将信息放入先前创建的结构类型中。

这是结构定义:

struct String
{
   const char* text;
   int sz;  //length of string not including null terminator
};

这里的代码给了我错误(这只是一个巨大的错误,最后它说“无法转换'标题'来输入'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;

读入的信息也只是文字。任何帮助或意见将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:3)

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

String artist;
input_file >> artist;

当然假设你有operator>>()的适当重载(我会在稍后解释一下)。

当你试图读入一个指针时,你得到一个错误,因为编译器找不到流提取操作符(operator>>())的重载,该操作符作为右手参数指向a String。你在底部看到"cannot convert 'title' to type 'signed char*'的原因是因为编译器列出了所有候选重载以及它们在尝试将artisttitle转换为右手参数时发出的相应错误。 / p>


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

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;

或者,您可以使用std::unique_ptr<String>std::unique_ptr<>是一个容器,当它超出范围时会为你管理内存,所以你不必自己解除分配资源:

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

如果您的编译器不支持std::unique_ptr<>这是一个新的(C ++ 11)对象,则可以使用std::shared_ptr<>


当将流I / O语义合并到用户定义的类中时,通常会提供流操作符的重载,然后将数据提取到类中。数据成员。它允许语法:

X x;
istream_object >> x;
ostream_object << x;

根据您向我们展示的内容,我不认为您为输入流对象提供了过载。这是String课程的样子:

std::istream& operator>>(std::istream& is, String& s)
{
    // code for extraction goes here
}

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