如何通过阅读文本文件

时间:2017-03-23 11:19:41

标签: c++

嗨大家我正在研究数据结构的分配,其中说:

考虑一个包含以下学生记录的图书馆数据库 属性:

•书籍ID(自动生成的ID,例如1240)

•书名(最多30个字符)

•作者姓名(最多30个字符;仅考虑单个/第一作者)

•发布商名称(最多30个字符,例如Pearson)

•版年(例如2000年)

•状态(已发布/未发布。提示:您可以为此使用标志变量)

•签发日期/退回(如果签发,则显示签发日期;否则显示

上次返回的日期。格式:ddmmyyyy。)

您的工作是编写C / C ++代码,以便能够对库数据库执行以下操作。您需要为此程序使用单链接列表。 的 1。为五本书的初始列表分配动态内存。最初使用赋值语句存储五本书的数据。

2。接下来,使用C / C ++中的文件流打开文本文件List1.txt,并将此数据从内存写入永久存储设备。

** 1。现在,假定数据永久存储在文件中,请实现应该能够执行以下功能的C / C ++例程:

一个。使用C / C ++文件流读取文本文件List1.txt,并临时加载 将此数据放入链接列表L1中,标题名为ListHead1

到目前为止我做了什么 创建了一个链接列表并将其存储到一个文件中,但我无法从文件重新加载数据并将其存储到一个新的链表中我到目前为止尝试过:

Librecord * read_from_List1(Librecord * head){

Librecord *newbook , *end;
ifstream infile("List1.txt");

if(infile.is_open()) {
    while(infile.good()){ 
        newbook = new Librecord;
        infile >> newbook -> bookID;
        getline(infile >> newbook -> title , '\n');
        getline(infile >> newbook -> author_name, '\n');
        getline(infile >> newbook -> publisher_name , '\n');
        infile >> newbook -> year_of_edition;
        infile >> newbook -> status;
        getline(infile , newbook -> issue_or_return_date,'\n');

        newbook -> next = NULL;
        if (head == NULL){
            head = newbook;
            end = newbook;
        }   
        else
            end -> next = newbook;
            end = newbook;
    }
    infile.close();
}
else
    cout << "Error openning file" << endl;
return head;

}

在编译时,我收到有关getline功能兼容性的错误消息

[错误]没有匹配函数来调用'getline(std :: basic_istream&amp;,char)'

我刚刚从java切换到c ++并尝试了很多,但找不到任何帮助的方式将非常感激

我的文字文件有数据:

1

java编程简介

Y daniel Liang

皮尔逊

2009

0

13-11-2015

2

java编程简介

Y daniel Liang

皮尔逊

2009

1

13-11-2015

3

在java中思考

G雷诺兹

麦格劳希尔

2011

0

2017年2月1日

4

IT中的道德规范

J M Kizza

皮尔逊

2006

1

13-3-2017

5

C ++如何编程

Dietel&amp; Dietel

Dietel Inc

2012

0

23-10-2014

,结构看起来像这样

int autoBookID = 0;
    struct Librecord{
        int bookID = ++autoBookID; 
        char title[30];
        char author_name[30];
        char publisher_name[30];
        int year_of_edition;
        bool status;
        char issue_or_return_date[11];
        Librecord *next;
    };

1 个答案:

答案 0 :(得分:0)

newbook = new Librecord;
infile >> newbook -> bookID;
getline(infile >> newbook -> title , '\n');  <---
getline(infile >> newbook -> author_name, '\n'); <---
getline(infile >> newbook -> publisher_name , '\n'); <---
infile >> newbook -> year_of_edition;
infile >> newbook -> status;
getline(infile , newbook -> issue_or_return_date,'\n');

在标记为getline()的调用中,您正在调用infile>>newbook->...,这会得到解决并返回对istream的引用,之后您的getline()会尝试解析2个参数,{ {1}}和istream,但它不存在。

在上一个char中,您实际上是通过getline()引用,然后指向istream数组然后指向char分隔符来正确调用此方法。

要解决您的错误,您应该更改之前的char来电。或者用更简单的话来说:解决一个错字。