将文件读入结构体(C++)

3

我是C++的新手,想要将一个文本文件读入结构体中。这个文本文件的第一行是double类型的数字,之后的每一行都表示礼物名称(愿望)。我创建了一个Wishlist结构体,包含一个double类型的数字和一个愿望向量。所以我做了以下操作:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

struct Gift
{
    double price;
    string name;
};

typedef vector<Gift> Giftstore;
typedef vector<string> Wishes;


int size(Giftstore& g) {return static_cast<int>(g.size());}

int size(Wishes& w) {return static_cast<int>(w.size());}


struct Wishlist
{
    double budget;
    Wishes wishes;
};


void reading_wishlist(ifstream& file, Wishlist& wish_list)
{
    if (file)
    {
        double money;

        file>>money;
        wish_list.budget<<money;
    }

    while(file)
    {
        string name;
        getline(file, name)
        wish_list.wishes.push_back(name);
    }

    file.close();
};


void print(Wishlist wish_list)
{
    cout<<"Budget: "<<wish_list.budget<<endl;
    cout<<"Wishes: "<<endl;

    for(int i=0; i<size(wish_list.wishes()); i++)
    {
        cout<<wish_list.wishes[i]<<endl;
    }
};

int main () {

  ifstream file;
  string filename;
  cout<<"Give a wishlist file: ";
  cin>>filename;

  file.open(filename)
  reading_wishlist(filename, wish_list);
  print(wish_list)

  return 0;
}

当我试图构建和运行时,我又赢得了一些错误奖项!第一个错误是这样说的:(in reference to: wish_list.budget<

对于二进制运算符<<,类型'double'和'double'的操作数无效。

这是什么意思?我需要重新定义运算符<<吗?还是可以将double读取为C字符串,然后再将其更改为double?

我该如何处理这个问题?更好的方法是:如何从文件中读取不同类型的数据?因为我还要将文件读入结构体Giftstore中,其中文本文件将在每行包含一个double和一个礼物名。


4
请发布完整的错误信息。您缺少一些关键信息,例如出现错误的文件名和行号。同时,请指出哪一行代码导致了错误。 - Code-Apprentice
1
嗯,仅仅是看一下,你错过了一些行末的分号。第43、69、71行。 - BenjiWiebe
“这是什么意思?” - 这意味着你输入的内容没有意义。你想要做什么? - Karoly Horvath
第37行,你应该使用wish_list.budget = money;而不是wish_list.budget<<money; - BenjiWiebe
第68行应该是Wishlist wish_list;,以便实际拥有一个Wishlist类型的对象来使用。 - BenjiWiebe
1个回答

5

这个错误来自于reading_wishlist函数中的以下一行:

wish_list.budget<<money;

在左侧(这里是WishList::budget)使用<<运算符不能使用double类型。
你的意思是:

wish_list.budget = money;


不客气!如果这解决了你的问题,你可以将其标记为答案。另外,如果你将void reading_wishlist重命名为ifstream& operator>>并返回file而不是关闭它,那么如果你想的话,你只需要写file>>wish_list就可以了。 - Karthik T
对于不存在的文件是有意义的。你得到的是未初始化的双精度和向量 - 你从未进入if(file)while(file)。顺便说一下,你可能还想在cin之后检查file的状态,因为你从cin中得到的最后一件事将是End-Of-File。 - Karthik T
我的 ifstream 使用出了很大的问题,我无法使用 file.open()。 - Lola
我遇到了这个错误:没有匹配的函数调用'std::basic_ifstream<char,std::char_traits<char> >::open(std::string&)'| - Lola
尝试使用filename.c_str()?这是一个编译错误,为什么到现在为止它还能工作? - Karthik T
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接