#TITLE1 Bla Bla bla bla bla bla bla bla bla bla bla bla bla Bla Bla bla bla bla
ID: 3917749 • Letter: #
Question
#TITLE1
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
***************
#TITLE2
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
***************
#TITLE3
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
***************
Here you can see that # prepends the title of the book after which we append and an excerpt from the corresponding book. In the file there are several titles and excerpts. Each book is separated by *************** .
How do I read a file (contain similar text) like given above so that TITLE1,TITLE2,TITLE3 are store in book.title node with no hash and bla bla bla are in book.body node with no asterisk sign.
You can assume any structure like:
struct book{
srting title;
string body;
};
output examle:
1)TITLE1
2)TITLE2
3)TITLE3
->1
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
Bla Bla bla bla bla bla bla bla bla bla bla bla bla
(**text inside title 1 is printed when we chose 1 as body is saved inside title**)
You can use only linked list, hashtable for it and yeah it is for C++11.
****C++11****
Explanation / Answer
Given below is the code for the question.
Please do rate the answer if it was helpful. Thank you
input file: books.txt
==========
#This it my title1
line1 of title1
line2 of title1
line3 of title1
line4 of title1
***************
#This it my title2
line1 of title2
line2 of title2
***************
#This it my title3
line1 of title3
line2 of title3
line3 of title3
***************
=======
main.cpp
=======
#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;
struct book_node{
string title;
string body;
book_node *next;
};
class book_list{
private:
book_node *head, *tail;
int count;
public:
book_list(){
head = nullptr;
tail = nullptr;
count = 0;
}
void add(string title, string body){
book_node *b = new book_node;
b->title = title;
b->body = body;
b->next = nullptr;
if(empty()){
head = tail = b;
}
else{
tail->next = b;
tail = b;
}
count++;
}
bool empty(){
return head == nullptr;
}
int size(){
return count;
}
book_node* get(int index){
if(index < 0 || index >= size())
return nullptr;
else {
book_node* current = head;
for(int i = 0; i < index; i++)
current = current->next;
return current;
}
}
void printTitles(){
book_node *current = head;
cout << "List of titles" << endl;
cout << "--------------" << endl;
for(int i = 1; i <= count; i++){
cout << i << ". " << current->title << endl;
current = current->next;
}
cout << endl;
}
~book_list(){
book_node *temp;
while(head != nullptr){
temp = head->next;
delete head;
head = temp;
}
head = nullptr;
tail = nullptr;
}
};
int main(){
string filename;
const string END_OF_BOOK_DATA = "***************";
string title, body, line;
cout << "Enter input filename: ";
cin >> filename;
ifstream infile(filename.c_str());
if(infile.fail()){
cout << "ERROR: could not open input file " << filename << endl;
return 1;
}
book_list blist;
while(getline(infile, title)){
title = title.substr(1); //discard 1st char and keep rest
body = "";
while(getline(infile, line)){
if(line == END_OF_BOOK_DATA)
break;
body += line + " ";
}
blist.add(title, body);
}
infile.close();
int choice = -1;
while(choice != 0){
blist.printTitles();
cout << "Enter title number (type 0 to quit): ";
cin >> choice;
if(choice != 0){
book_node *b = blist.get(choice-1);
if(b == nullptr){
cout << "Non existing title!" << endl;
}
else
cout << b->body << endl << endl;
}
}
}
=======
output
=======
Enter input filename: books.txt
List of titles
--------------
1. This it my title1
2. This it my title2
3. This it my title3
Enter title number (type 0 to quit): 1
line1 of title1
line2 of title1
line3 of title1
line4 of title1
List of titles
--------------
1. This it my title1
2. This it my title2
3. This it my title3
Enter title number (type 0 to quit): 3
line1 of title3
line2 of title3
line3 of title3
List of titles
--------------
1. This it my title1
2. This it my title2
3. This it my title3
Enter title number (type 0 to quit): 2
line1 of title2
line2 of title2
List of titles
--------------
1. This it my title1
2. This it my title2
3. This it my title3
Enter title number (type 0 to quit): 0
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.