В каком формате я должен написать свой файл .txt, если я хочу использовать getline для программы на C ++? - PullRequest
1 голос
/ 14 апреля 2020

У меня есть этот код в моей основной программе. Я не знаю, должен ли мой текстовый файл быть отформатирован таким образом, чтобы мой основной getline получал из него

//...
BOOK_TYPE book[100];
int index = -1, choice;

input.getline(book[++index].isbn, 14);

while (input)
{
    input.getline(book[index].author, 20);
    input.getline(book[index].title, 30);
    input.getline(book[index].publisher, 20);
    input.getline(book[index].year, 5);
    input.getline(book[index].price, 10);
    input.getline(book[index].quantity, 103);

    for (int k = 0; k < 5; k++)
    {
        input.getline(book[index].category[k].cor_x, 2);
        input.getline(book[index].category[k].cor_y, 2);
        input.getline(book[index].category[k].genre, 20);
    }
    // clear unwanted whitespace
    if (input.peek() == '\n')
        input.ignore(256, '\n');
    // read next number
    input.getline(book[++index].isbn, 14);
}
input.close();
//...

Скажем, у меня есть этот список книг:

9780809875214,John Wick,The assasinate of a Gang,Tree Production,2014,39.00,4,2,2
9788373191723,J.R.R Tolkien,The Lord of the Rings,Allen & Unwin,1954,120.45,6,3,1
9783791535661,Lewis Carroll, Alice's Adventure in Wonderland,Macmillan Publishers,1865,100.25,5,3,2
9781517322977,Mikhail Bulgakov,The Master and Margartia,Penguin Books,1967,125.00,7,3,3
9780676516197,Vladmir Nabokov,Lolita,Olympia Press,1955,98.25,3,3,1
9781095627242,Anna Sewell,Black Beauty,The Jarrold Group,1877,60.25,2,3,2
9788497592581,Umberto Eco,The Name of the Rose,Bompiani,1980,45.65,7,1,3
9780062316110,Harari and Yuval Noah,Sapiens: A Brief History of Humankind,Harper Perennial,2018,18.06,2,1,3

Я бы хотел знать, где должен быть интервал, вводить следующую строку и т. д., чтобы мой файл можно было читать построчно и выводить его в виде списка книг пользователю, когда они выбирают это.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Вы можете использовать std::getline и std::stringstream для чтения во всех книгах.

Обратите внимание, что вам не хватает свойства жанра в файл.

Вот пример программы с комментариями, чтобы сделать это, я сделал вывод о классах из вашего кода, если что-то не так, вы можете изменить код:

Рабочий образец

#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>

class Category {
public:
    int cor_x;
    int cor_y;
    std::string genre;
};

class BOOK_TYPE {
public:
    std::string isbn;
    std::string author;
    std::string title;
    std::string publisher;
    std::string year;
    double price;
    int quantity;
    Category category;
};

int main() {

    std::vector<BOOK_TYPE> books; //dynamic container for books

    BOOK_TYPE book;
    std::string temp, price, quantity, cor_x, cor_y, genre, tempin;
    std::fstream input;
    input.open("test.txt");

    if(!input.is_open()){
        std::cerr << "No file";
        return 1;
    }      

    while (std::getline(input, tempin)) //read each whole line till there are no more
    {
        std::stringstream temp(tempin); //stream format
        getline(temp, book.isbn, ','); //read all properties with commma separator
        getline(temp, book.author, ',');
        getline(temp, book.title, ',');
        getline(temp, book.publisher, ',');
        getline(temp, book.year, ',');
        getline(temp, price, ',');
        book.price = stod(price);
        getline(temp, quantity, ',');
        book.quantity = stoi(quantity);
        getline(temp, cor_x, ',');
        book.category.cor_x = stoi(cor_x);
        getline(temp, cor_y, ',');
        book.category.cor_y = stoi(cor_y);        
        getline(temp, book.category.genre);
        books.push_back(book);  //add book to the vector of books
    }
    input.close();

    //test print some of the properties in range based loop, you can print the rest
    // you can use the normal for loop with books[i] and i < books.size()
    for(auto book : books)
        std::cout << book.title << " " << book.author <<  " " << book.isbn << " " 
        << book.category.cor_y << " " << book.category.cor_x << " " 
        << book.price << " " <<  book.category.genre << std::endl;
}
0 голосов
/ 14 апреля 2020

Вы можете оставить свой файл как есть, с запятыми в качестве разделителей. Вам просто нужно указать другой разделитель с помощью getline.

std::getline(input, target_string, ',')

, где target_string - это атрибут книги [index] .author, title или других.

Для последнего атрибута в строке, которую вы будет использовать это:

std::getline(input, target_string)

Новая строка является разделителем по умолчанию.

...