Wcztywanie danych z pliku i czyszczenie bufora

0
 void wczytanie_z_pliku_ksiazek (char * nazwa, ksiazka *ksiazka)
{
    fstream plik;
    int i = licznik_linii(nazwa);
    i = i/3; // ile lini jest w pliku
    int x =0;
    plik.open(nazwa);
    if ( plik.is_open())
    {
        while (x < i)
        {

            getline(plik, ksiazka[i].autor_imie, '\n');
            cin.sync();
            cin.clear();
            getline(plik, ksiazka[i].autor_nazwisko, '\n');
            cin.sync();
            cin.clear();
            getline(plik, ksiazka[i].tytul, '\n');
            cin.sync();
            cin.clear();
           plik >> ksiazka[i].naklad;
           cin.sync();
           cin.clear();
            cout << "imie = " << ksiazka[i].autor_imie << " " << "Nazwisko = " << ksiazka[i].autor_nazwisko << '\n';
            cout << ksiazka[i].tytul << '\n';
            cout << ksiazka[i].naklad << '\n';
            x++;
        }
    }
    plik.close();
}

plik :

Henryk
Sienkiewicz
W pustyni i w puszczy
20
Imie
Nazwisko
Tytul jakis
70

I problem jest, że przy ponowny wejściu w pętle w buforze zostaje spacja, która przypisuje się do nastepnego imienia. :/

Jest ktoś w stanie pomóc?

1

Nie działa najprawdopodobniej dlatego, że korzystasz z takiego odczytu plik >> ksiazka[i].naklad;. Wczytując dane dobrze tutaj używać jednak getline. Oczywiście rzeczy typu cin.sync() itp. są zbędne. Możesz zrobić to tak:

#include<iostream>
#include<string>
#include<vector>
#include<fstream>
using namespace std;

struct book{
	string author_name;
	string author_surname;
	string title;
	int issue;
};

void read_books(const char* path, vector<book>& books){
	fstream file(path, ios::in);
	if (file.is_open()){
		string line = "";
		getline(file, line);
		unsigned count = stoi(line);

		for (int i = 0; i < count; ++i){
			book book;
			getline(file, book.author_name);
			getline(file, book.author_surname);
			getline(file, book.title);
			getline(file, line);
			book.issue = stoi(line);
			books.push_back(book);
		}
	}
}

void print_books(const vector<book>& books){
	for (unsigned i = 0; i < books.size(); ++i)
	{
		cout << "Title: " << books[i].title
			<< "\nAuthor: " << books[i].author_name << " " << books[i].author_surname
			<< "\nIssue: " << books[i].issue << "\n\n";
	}
}

int main(){
	vector<book> books;
	read_books("books.txt", books);
	print_books(books);
	return 0;
}

Dodatkowo zapisując w pierwszej linijce ilość książek do wczytania unikniesz każdorazowego zliczania linijek w pliku.

Tak wygląda plik:

2
Henryk
Sienkiewicz
W pustyni i w puszczy
20
Imie
Nazwisko
Tytul jakis
70
0

Niestety, nie mogę używać Wektorów. Jest to zadanie na laborki, a nasza prowadząca zabrania używać czegoś, czego nie było na wykładzie :D
Niestety, dodałem #include <string> a potem chciałem użyć stoi i pokazuje, że nie jest zadeklarowany :/

 getline(plik, line,'\n');
            ksiazka[i].naklad = stoi(line)
0

No sorry ale zamiana czegoś takiego na zwykłą tablicę to jest zmiana dosłownie paru linijek w pętli, tak żeby korzystać z indeksów tablicy zamiast stworzonego nowego obiektu. Jeżeli masz tam gotową tablicę obiektów klasy book to jest to kosmetyczna zmiana.

0
kenik napisał(a):

Niestety, nie mogę używać Wektorów. Jest to zadanie na laborki, a nasza prowadząca zabrania używać czegoś, czego nie było na wykładzie :D
Niestety, dodałem #include <string> a potem chciałem użyć stoi i pokazuje, że nie jest zadeklarowany :/

 getline(plik, line,'\n');
            ksiazka[i].naklad = stoi(line)

A dlaczego stoi nie działa ? ;x
próbowałem też :

 ksiazka[i].naklad = atoi(line.c_str());
0

Nie działa, bo stoi dostępne jest dopiero od C++11. Skonfiguruj sobie odpowiednio IDE, żeby przekazywało kompilatorowi, że ma kompilować używając C++11.

1 użytkowników online, w tym zalogowanych: 0, gości: 1