Czytanie pliku od określonego "miejsca" do "miejsca".

0

Mam sobie plik tekstowy, w którym przechowuję recenzje płyt CD. Każda płyta ma swoją ilość recenzji i odzielone są one seperatorami w postaci

<start:tytul=tytul plyty1>
 bla bla bla bla tresc recenzji1
<koniec:tytul=tytul plyty1>
<start:tytul=tytul plyty2>
 bla bla bla bla tresc recenzji2
<koniec:tytul=tytul plyty2>
<start:tytul=tytul plyty1>
 bla bla bla bla tresc recenzji1
<koniec:tytul=tytul plyty2>

Teraz chcę sobie odczytać z tego pliku na ekran konsoli, tylko te recenzje, ktore sa zgodne z nazwa plyty:
No i ze w pliku mam wiersze, no to pomyslalem, ze bede sobie odczytywal wierszami plik tekstowy, ale to nic nie da. Nie wiem teraz jak odczytywac plik od tekstu <start:tytul=tytul plyty1> do <koniec:tytul=tytul plyty1>, pomijajac kolejna recenzje "tytul plyty2" i czytajac ponownie inna recenzje dla plyty1, tak jak podalem powyzej. Myslalem, tez nad wczytywaniem pojedynczych znakow i porownywania czy sa rozne od "<",">", ale to chyba tez nic nie da.

Ktoś mi pomoże, ma jakiś pomysł?

2

użyj XML i gotowych funkcji do jego obsługi, zamiast niepotrzebnie wymyślać dziwny format, który go udaje.

0

Skąd ma znać XMLa? To są zwykłe pliki w C, pytam o zasade, jak odczytywać od 'czegoś' do 'czegoś'?

0

deklaracja zmiennej znaleziono typu bool zainicjowana wartością false

w pętli
odczyt linii pliku
jeżeli linia zawiera ciąg znaków "<start:tytul=" i zawiera tytuł szukanej płyty
to ustaw znaleziono na true
w przeciwnym razie jeżeli linia zawiera ciąg znaków "<koniec:tytul="
to ustaw znaleziono na false
w przeciwnym razie jeżeli zmienna znaleziono ma wartość true
to wyświetl linię na ekranie
koniec pętli

0

O to moja proceedura, ktora udalo mi sie naskrobac wg. wskazowek, ale niestety ona nie działa : (

Kod:

void wyswietlrecenzje(FILE *plikbin,FILE *pliktxt)
{
	int i,n,chr,znaleziono;
	struct Tinfcd plytaCD;
	char wiersz[1000];
	char temp1[1000];
	char temp2[1000];
	char tytul[50];
	
	system("cls");
	znaleziono=0;
	pliktxt=fopen("recenzje.txt","rt");
	plikbin=fopen("plytaCD.dat","rb");
	fseek(plikbin,0,SEEK_END);
	n=ftell(plikbin)/sizeof(plytaCD);
	fseek(plikbin,0,SEEK_SET);
	printf("Podaj tytul plyty, dla ktorej chcesz wyswietlic recenzje: ");
	scanf("%s",tytul);
	while (!feof(pliktxt))
	{
		strcpy(temp1,"<start=tytul:");
		strcat(temp1,tytul);
		strcat(temp1,">");
		strcpy(temp2,"<koniec=tytul:");
		strcat(temp2,tytul);
		strcat(temp2,">");
		fgets(wiersz,1000,pliktxt);
		if(strcmp(temp1,wiersz)==0)
		{       znaleziono=1;}
		else
		{
			if(strcmp(temp2,wiersz)==0)
			{znaleziono=0;}
		}
		if(znaleziono==1)
		printf("%s",wiersz);
	}
	fclose(pliktxt);
	fclose(plikbin);
}

Problem jest taki, ze kiedy dochodzi do tej lini :

 if(strcmp(temp1,wiersz)==0) oraz if(strcmp(temp2,wiersz)==0)

i odczytany wiersz i temp sa sobie rzeczywiscie rowne (sprawdzalem), to nic sie nie dzieje : (

Co jest nie tak?

0

Ktoś podpowie? To pilne.

0
  1. fgets() pobiera również znak końca linii '\n', więc:
  • usuń go z bufora wiersz
  • lub dodaj go do temp1 i temp2
  • lub użyj funkcji strstr() zamiast strcmp()
  1. W pierwszym poście podałeś szablon
    <start:tytul=
    a teraz
    <start=tytul:
    Zdecyduj się.

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