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

Odczyt z pliku o dwie linie wcześniej

Nowy postprzez nvdante » poniedziałek, 12 stycznia 2015, 21:35

Witam

Mam mały problem z napisaniem programu, który odczytuje dane z pliku.
Potrzebuję, aby po odnalezieniu linii zawierającej X program wczytał dwie linie wcześniej, linię X oraz kilka linii dalej. Dokładniej jeżeli X=coś to wyświetl -2, -1, 0, 1, 2, 3, 4.
W pliku dane wyglądają tak:
Kod: Zaznacz cały
0
Tytuł
Wykonawca
Album
Rok
Cena
1
Tytuł
Wykonawca
Album
Rok
Cena
itd

Udało mi się napisać kod liczący ilość linii, następnie wstawiam to do pętli for i chciałem z jej pomocą odczytywać konkretne linie, ale nie wiem, jak zdefiniować cofnięcie się o dwie linie. Jakiś pomysł?
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, 11:04

Kombinujesz jak koń pod górę. Wczytaj tę swoją bazę/katalog do pamięci, do jakiegoś kontenera, zamiast kombinować ze strumieniami.
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 » wtorek, 13 stycznia 2015, 11:27

Chętnie tylko jak wczytać tak różne dane do struktury?
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 » wtorek, 13 stycznia 2015, 12:40

W czym masz to otwarte?

Jeśli są to dane tekstowe a konkretny wpis ma zawsze jeden wiersz to najprościej użyć klasy TStrings/TStringList. Dostęp do wybranego wiersza masz tam za pomocą właściwości Strings[x] gdzie x to numer wiersza (liczony od zera).

Jeśli swoje dane masz w strumieniu to możesz je przepisać do 'Strings' (i na odwrót) za pomocą metod LoadFromStream/SaveToStream.
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 » wtorek, 13 stycznia 2015, 12:50

Zapisane mam w tekście i chciałem odczytywać tak:
KOD cpp:     UKRYJ  
        ifstream z("playlista.txt");
        string linia;
        ...
        z.close();

Problem jednak w tym, że w strukturze mam 6 zmiennych, a w pliku np.: 300 linijek.
Jak przypisać do struktury dane, które się zmieniają i każda linia ma zajmować inaczej opisane pole ( albumy[i].tytul, albumy[i].wykonawca, itd... )?
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 » wtorek, 13 stycznia 2015, 18:45

Dziwne, wydawało mi się, że w prywatnych wiadomościach wszystko zostało wyjaśnione odnośnie czytania/zapisywania ze/do strumienia.
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 Mironas » wtorek, 13 stycznia 2015, 18:54

Czy jest jakiś konkretny powód dla którego otwierasz plik w ifstream ?
Bo moim skromnym zdaniem, do tego bardziej przydatny będzie TStrings albo TIniFile.
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 » wtorek, 13 stycznia 2015, 19:09

Mironas napisał(a):Czy jest jakiś konkretny powód dla którego otwierasz plik w ifstream ?
Bo moim skromnym zdaniem, do tego bardziej przydatny będzie TStrings albo TIniFile.

Tak, to zadanie z uczelni.
Wykonanie jest dowolne byle użyć ofstream/ifstream do zapisu/odczytu danych wprowadzonych przez użytkownika do struktury.

@polymorphism być może czegoś nie kojarzę, podpowiedz to sobie przypomnę, bo o ile pamiętam mówiliśmy o zapisie, nie o odczycie danych do struktury.
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, 19:17

O zapisie było później. Najpierw było o sposobie walidacji wprowadzanej wartości liczbowej, później o getline. Gdzieś tam cały czas przewijał się operator >>. Czyli było wszystko, czego potrzebujesz do odczytu. Jako podpowiedź zdradzę, że ze sformatowanego strumienia plikowego czytasz (prawie) dokładnie tak samo jak ze strumienia cin ;)

p.s. TStrings i TIniFile pasuje tutaj jak pięść do oka.
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, 19:40

Czyli chodzi Ci o coś takiego:
KOD cpp:     UKRYJ  
     ifstream plik("playlista.txt");
     int a;
     string b;
     int c;
     plik >> a >> b >> c;

?
Tylko jak zrobić z tego pętlę na X linii tak, żeby wczytać wszystkie dane do konkretnych zmiennych.
Ps.: Poza tym o ile się nie mylę to ta metoda pominie białe znaki, więc tytuły albumów zostaną obcięte, nie?
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, 19:50

KOD cpp:     UKRYJ  
int n;

while( plik >> n ) // tu ta pierwsza wartość
{
        getline(plik, /* tu odpowiednie pole struktury */);
        getline(plik, /* tu odpowiednie pole struktury */);
        getline(plik, /* tu odpowiednie pole struktury */);
        plik >> /* tu odpowiednie pole struktury */;
        plik >> /* tu odpowiednie pole struktury */;

        /* tu dodajesz strukturę do listy */
}
 
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, 20:05

Przepraszam, ale nie bardzo to rozumiem, a chciałbym...
Dopisałem tak:
KOD cpp:     UKRYJ  
        int n; // do czego ta deklaracja? Jeżeli do pętli to czy można ją zakończyć, jak będzie EOF?

        while( z >> n ) // tu ta pierwsza wartość - tego nie rozumiem, o jakiej wartości piszesz? O części struktury, czyli albumy.kolejnosc?
{
        z >> albumy.kolejnosc;
        getline(z, albumy.tytul);
        getline(z, albumy.wykonawca);
        getline(z, albumy.album;
        z >> albumy.rok;
        z >> albumy.cena;

        /* tu dodajesz strukturę do listy */
}

Czy dobrze rozumiem, że zapis z operatorem >> jest dla integera, a getline dla stringa?
Co oznacza dodać strukturę do listy?
Wybacz ilość pytań, ale chciałbym to dokładnie pojąć.
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, 20:34

KOD cpp:     UKRYJ  
while( z >> n ) // tu ta pierwsza wartość - tego nie rozumiem, o jakiej wartości piszesz? O części struktury, czyli albumy.kolejnosc?
{
        z >> albumy.kolejnosc;

Tak o tym. Choć nie wiem, po co zapisywać kolejność, jeśli ona wynika z pozycji w pliku. Tak czy siak, powinno być tak:
KOD cpp:     UKRYJ  
while( z >> albumy.kolejnosc )
{
      ...
}

Jeśli chodzi o operator >> i getline, to odpowiedź brzmi: tak. Choć rozwiązanie z operatorem >> jest trochę naiwne, bo wystarczy, że za liczbą będzie cokolwiek co nie jest '\n', i wszystko się rozsypie. Zrobiłbym funkcję, która odczyta liczbę i doczyta w razie potrzeby do końca linię.

Co oznacza dodać strukturę do listy?

W sumie chodziło mi o jakiś kontener. A co to oznacza? Oznacza to tyle, że czytasz struktury z pliku i dodajesz je do jakiegoś kontenera, np. vector, w celu wygodnego operowania na nich.
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:09

polymorphism napisał(a):Tak o tym. Choć nie wiem, po co zapisywać kolejność, jeśli ona wynika z pozycji w pliku.

Zmienną "kolejność" określam podczas wprowadzania albumów za pierwszym razem, ale później, gdy wyszukuję np.: po wykonawcy to dostaję info, na której pozycji była wprowadzona.

polymorphism napisał(a):w celu wygodnego operowania na nich.

Prawdę mówiąc w programie muszę jedynie wyświetlić dane, jeśli trafię na podany przez użytkownika zespół ( wykonawca ), więc myślę, że zrobię to w instrukcji warunkowej w pętli i tyle.

Czy w takim razie tak jest dobrze?:
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[6];

int main()
{
        ifstream z("playlista.txt");
       
        while( z >> albumy.kolejnosc )
{
        getline(z, albumy.tytul);
        getline(z, albumy.wykonawca);
        getline(z, albumy.album;
        z >> albumy.rok;
        z >> albumy.cena;
       
        cout<<albumy.tytul;
        cout<<albumy.wykonawca;
        cout<<albumy.album;
        cout<<albumy.rok;
        cout<<albumy.cena;
}
        z.close();
       
        system("PAUSE");
        return 0;
}

Dodam, że dostaję błędy:
Kod: Zaznacz cały
C:\Users\dante\Desktop\main.cpp   In function 'int main()':
27   27   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'tytul' in 'albumy', which is of non-class type 'playlista [6]'
28   27   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'wykonawca' in 'albumy', which is of non-class type 'playlista [6]'
29   27   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'album' in 'albumy', which is of non-class type 'playlista [6]'
30   21   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'rok' in 'albumy', which is of non-class type 'playlista [6]'
31   21   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'cena' in 'albumy', which is of non-class type 'playlista [6]'
33   22   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'tytul' in 'albumy', which is of non-class type 'playlista [6]'
34   22   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'wykonawca' in 'albumy', which is of non-class type 'playlista [6]'
35   22   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'album' in 'albumy', which is of non-class type 'playlista [6]'
36   22   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'rok' in 'albumy', which is of non-class type 'playlista [6]'
37   22   C:\Users\dante\Desktop\main.cpp   [Error] request for member 'cena' in 'albumy', which is of non-class type 'playlista [6]'
28      C:\Users\dante\Desktop\Makefile.win   recipe for target 'main.o' failed
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:14

Przecież albumy to tablica, a dobierasz się do pól jakby to była pojedyncza struktura. Po co ta tablica?

http://pl.wikibooks.org/wiki/C/Tablice
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

Nastę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