CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Odczyt z pliku o dwie linie wcześniej

Odczyt z pliku o dwie linie wcześniej

dział ogólny

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez nvdante » wtorek, 13 stycznia 2015, 21:27

Ta: playlista albumy[6]; ?
No dobra, to powinienem zamknąć to w pętli? Niestety błędy wywala nawet bez zdefiniowanego wyświetlania.
Muszę przyznać, że tego nie kumam.
Jak to powinno wyglądać w algorytmie?
- Otwieram plik
- Pobieram dane przez getline lub operator >>
- Wrzucam je w pola struktury
i co dalej? Zrobić pętlę i wyświetlić?
KOD cpp:     UKRYJ  
        for (int i=0; i<12; i++)
                {
                cout<<albumy[i].tytul;
                cout<<albumy[i].wykonawca;
                cout<<albumy[i].album;
                cout<<albumy[i].rok;
                cout<<albumy[i].cena;
                }

Tylko, że te błędy nadal są :/
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez polymorphism » wtorek, 13 stycznia 2015, 21:33

Jeśli tego nie kumasz, to po co używasz?!

Skoro tablica nie jest Ci potrzebna, to zdefiniuj albumy jako pojedynczy obiekt:
KOD cpp:     UKRYJ  
playlista album;
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez nvdante » wtorek, 13 stycznia 2015, 21:50

Samo założenie rozumiem, ale pogubiłem się w tym co napisałeś, a wolałbym wiedzieć co robię.
Zmieniłem na:
KOD cpp:     UKRYJ  
#include <iostream>
#include <windows.h>
#include <string.h>
#include <fstream>

using namespace std;

struct playlista
{
        int kolejnosc;
        string tytul;
        string wykonawca;
        string album;
        int rok;
        int cena;
};

playlista albumy;

int main()
{
        ifstream z("playlista.txt");
        string linia;
       
        while( z >> albumy.kolejnosc )
{
        getline(z, albumy.tytul);
        getline(z, albumy.wykonawca);
        getline(z, albumy.album);
        z >> albumy.rok;
        z >> albumy.cena;
}
        z.close();

        for (int i=0; i<12; i++)
                {
                cout<<albumy.tytul;
                cout<<albumy.wykonawca;
                cout<<albumy.album;
                cout<<albumy.rok;
                cout<<albumy.cena;
                }
       
        system("PAUSE");
        return 0;
}

Z tym, że w wyniku mam same 000000...
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez polymorphism » środa, 14 stycznia 2015, 10:16

(...) ale pogubiłem się w tym co napisałeś

No właśnie, problem w tym, że nie znasz podstaw języka, i w takim układzie ciężko jest cokolwiek wytłumaczyć. Używasz pętli, choć odnoszę wrażenie, że sam nie wiesz po co. Pisałeś, że to na zaliczenie. Co to za studia, jaki kierunek?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez Mironas » środa, 14 stycznia 2015, 10:41

polymorphism napisał(a):p.s. TStrings i TIniFile pasuje tutaj jak pięść do oka.

A to niby dlaczego?
Baza danych utworów w pliku INI gdzie nazwa sekcji to unikatowy identyfikator utworu (numer kolejny):
Kod: Zaznacz cały
[1]
Tytul=Ala ma Kota
Wykonawca=Ola Piosenkowska
Album=Miauuuu
Rok=2014
Cena=50.00


ReadSections(...) - odczytujesz nazwy sekcji (czyli istniejące identyfikatory).
ReadString(...) - odczyt wybranej pozycji z wybranej sekcji.
WriteString(...) - zapis (modyfikacja) wybranej pozycji w dowolnej sekcji.
EraseSection(...) - usunięcie sekcji (utworu).

Do pliku dodałbym też sekcję "systemową" gdzie trzymałbym np ostatnio użyty nr kolejny utworu.

Może być coś prostszego? Oczywiście nie wiedziałem, że jest odgórny wymóg, aby użyć strumieni.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez nvdante » środa, 14 stycznia 2015, 10:42

polymorphism napisał(a):Pisałeś, że to na zaliczenie. Co to za studia, jaki kierunek?

A co to za różnica jakie studia i kierunek? Mam napisać program, co ma się w nim znaleźć jest jasno określone, więc skoro masz większe doświadczenie i widzisz, że gdzieś popełniam błąd to po prostu napisz "tu robisz źle". Nie trzeba od razu wytykać, że ktoś wie mniej, bo to, że słuchasz muzyki nie musi oznacza, że umiesz komponować.

Wracając do problemu. Pętli używam do dwóch rzeczy, do pobrania danych do odpowiednich pól oraz do ich wyświetlenia.
Problem jednak w tym, że pojawiają mi się dane szczątkowe, dokładniej:
Kod: Zaznacz cały
kolejność // zawsze 0, a powinna być konkretna liczba
tytuł
wykonawca
0
0

A powinno być:
Kod: Zaznacz cały
kolejność
tytuł
wykonawca
album // to pole jest pomijane
rok // od tą są zera w wyniku
cena

Wygląda na to, że część pól została wycięta, a część zamiast wyświetlić konkretną liczbę podała 0.
Poza tym ten kod powoduje przewałkowanie tylko pierwszych 6 linii kodu, pozostałe są kompletnie pomijane ( widzę po tym, że tytuł jest cały czas ten sam ).
Czy możesz naprowadzić mnie na właściwą drogę co jest nie tak? Wydawało mi się, że takie problemy mogą się pojawić, gdy mam litery, a próbuję wyświetlić jako int, ale w konkretnych polach są cyfry.

Ps.: Przed chwilą zrobiłem małą zmianę, otóż zdublowałem wiersz pobierający przez getline zmienną do albumy.wykonawca. Ta operacja spowodowała, że wszystkie pola zapełniły się prawidłowymi danych, wszystkie dane z pliku zostały pobrane i prawidłowo wyświetlone. Mam dlatego pytanie: dlaczego zdublowanie tej linii pomogło?
Kod potwierdzający to:
KOD cpp:     UKRYJ  
                                z >> albumy.kolejnosc;
                                getline(z, albumy.tytul);
                                getline(z, albumy.wykonawca);
                                getline(z, albumy.wykonawca);
                                getline(z, albumy.album);
                                z >> albumy.rok;
                                z >> albumy.cena;

Dane wynikowe:
Kod: Zaznacz cały
0
Michael Jackson
Ben
1972
100
1
Michael Jackson
Thriller
1991
100
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez polymorphism » środa, 14 stycznia 2015, 11:35

Mironas napisał(a):A to niby dlaczego?

W przypadku INI trzeba przeedytować plik - dojdzie dużo zbędnych rzeczy, jak nazwy wartości. Format danych w pliku podanym przez nvdante jest prosty i można bez problemu odczytać go za pomocą istream. W przypadku TStrings podobnie - po co tworzyć listę linii jeśli można od razu czytać (linie) do struktur, do odpowiednich pól?

A co to za różnica jakie studia i kierunek?

Różnica żadna, zwykła ciekawość ;)

Co do reszty, pokaż dane wejściowe.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez nvdante » środa, 14 stycznia 2015, 11:38

Plik playlista.txt ma takie dane:
Kod: Zaznacz cały
0
Ben
Michael Jackson
Ben
1972
100
1
Thriller
Michael Jackson
Thriller
1991
100
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez Mironas » środa, 14 stycznia 2015, 11:58

polymorphism napisał(a):W przypadku INI trzeba przeedytować plik - dojdzie dużo zbędnych rzeczy, jak nazwy wartości.

Nikt nie mówił, że chodzi o istniejący już plik do obsługi którego robimy aplikację.
Zwykle format zapisu danych w pliku ustalany jest przez programistę który robi aplikację.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez polymorphism » środa, 14 stycznia 2015, 12:04

Dobra już wiem gdzie leży problem. Chodzi o to, że operator >> nie ściąga znaku końca linii (generalnie nie ściąga znaku na którym kończy skanowanie), przez co getline czyta pustą linie. Wszystko się przesuwa i mamy totalny fuck up.

Tak powinno być ok:
KOD cpp:     UKRYJ  
    while( z >> albumy.kolejnosc )
    {
        z.ignore((unsigned)-1, '\n');
        getline(z, albumy.tytul);
        getline(z, albumy.wykonawca);
        getline(z, albumy.album);
        z >> albumy.rok;
        z >> albumy.cena;

        cout<< albumy.tytul << '\n';
        cout<< albumy.wykonawca << '\n';
        cout<< albumy.album << '\n';
        cout<< albumy.rok << '\n';
        cout<< albumy.cena << '\n';
    }
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez nvdante » środa, 14 stycznia 2015, 12:15

Niestety w wyniku dostaję:
Kod: Zaznacz cały
(pusta linia)
Ben
Michael Jackson
0
0

czyli wygląda na to, że pominął linię albumy.album i wyciął dane.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez polymorphism » środa, 14 stycznia 2015, 13:00

Ciekawa sprawa, bo w Visualu to działa, a w Code::Blocks nie. Na logikę visual jest tu bardziej wiarygodny.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez nvdante » środa, 14 stycznia 2015, 13:06

Masz pomysł dlaczego tak się dzieje lub co mogę dalej zrobić?
Może jakoś inaczej spróbujemy odczytać dane? Właściwie chodzi tylko o to, żeby wyświetlone były te, które spełnią warunek wpisany przez użytkownika, czyli wykonawca == X.

Ps.: W związku z tym, że mogę zaprogramować inny sposób zapisu może wybranie opcji pliku binarnego by pomogło do odczytu?
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez polymorphism » środa, 14 stycznia 2015, 13:26

Dobra już mam. Zmień pierwszy parametr ignore:
KOD cpp:     UKRYJ  
(unsigned)-1

na bardziej prawilny:
KOD cpp:     UKRYJ  
std::numeric_limits<std::streamsize>::max()

W czym rzecz. W obu przypadkach, i w VC, i w C::B, pierwszy parametr jest typu std::streamsize. W swej naiwności założyłem, że typ ten jest typem unsigned (no bo jak rozmiar strumienia może być ujemny?), i tu był mój błąd. Typ ten, nie wiedzieć czemu, jest typem ze znakiem. Dlaczego w VC działało, a w C::B nie: w visualu typ streamsize jest typem 64-bitowym, przypisanie (unsigned)-1 da w efekcie wartość 4294967295. Z kolei w C::B (mingw) streamsize jest 32-bitowy, przypisanie (unsigned)-1 da w parametrze wartość -1, i dlatego to nie działało.

Teraz powinno być ok.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt z pliku o dwie linie wcześniej

Nowy postprzez nvdante » środa, 14 stycznia 2015, 13:39

Faktycznie działa dobrze. Bardzo dziękuję :)
Swoją drogą czy dobrze rozumiem, że skompilowanie poprzedniego kodu w mingw 64bit powinno działać prawidłowo?
Bo Dev-c++ też wykorzystuje mingw, więc to pewnie właśnie w tym tkwił problem, jak mówiłeś.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron