Parsování souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Parsování souboru – C / C++ – Fórum – Programujte.comParsování souboru – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
oxidián0
Grafoman
27. 2. 2015   #1
-
0
-

Mám txt soubor ve kterém jsou tato data:

@10 	# počet vrstev
*2:RGB 	# Hvězdička označuje vrstvu, kterou chceme založit a přidělit ji paměť. 
*3:RGB 50% # číslo se znakem procenta je průhlednost vrstvy
*4:HSV 100% &3 # Ampersand na konci řádku, který začíná hvězdičkou přiděluje masku
*5:BW  ... # Vytvoření černobílé masky, místo teček bude argument
&2:RGB # RGB označuje kanály, které chcete ovlivnit příkazem
&3:G # H označuje kanál, který chcete ovlivnit příkazem. V tomto případě pouze odstín..
&4:H # H označuje kanál, který chcete ovlivnit příkazem. V tomto případě pouze saturaci..

Chtěl bych to rozparsovat, ale mám problém hned na prvním řádku, vypadá to že se to zacyklovalo.

http://paste.ofcode.org/xJLztXU2pARPvjehgVTwVU

Dělám to parsování správně? Chci rozparsoval řádek linTok má nést hodnotu řádku. colTok má nést hodnotu sloupce, argTok nést argument a parTok má být parametr. Takže hodnotu parTok chci získat parsováním argTok, argTok chci získat parsováním colTok a colTok zase parsováním linTok.

Nahlásit jako SPAM
IP: 78.45.199.–
PiranhaGreg0
Stálý člen
27. 2. 2015   #2
-
0
-

Co to řešit celý přes scanf? Je to nejjednodušší...

např.

#include <stdio.h>
#include <assert.h>

typedef struct {
	char type;
	int line;
	char color[4];
} Head;

int main(void) {
	int layersCount;

	assert(scanf("@%d", &layersCount) == 1);

	while(1) {
		int r;
		Head tmp;

		assert((r = scanf("%c%d:%s", &tmp.type, &tmp.line, tmp.color)) == 3);
		if (r == EOF) break;

		/* další parsování argumentů a parametrů pomocí scanf... */
	}

	return 0;
}
Nahlásit jako SPAM
IP: 109.81.210.–
oxidián0
Grafoman
27. 2. 2015   #3
-
0
-

Byly tam dva překlepy, aktuální kód:

http://paste.ofcode.org/MBn8FfDciNb784wCrLKghG

problém je v tom že na řádku 55 se nenačte další řádek (je tam null a hned se cyklus ukončí). A píše to: lineTok: Cannot access memory at address 0x0

@PiranthaGreg: nerozumím tomu tvému kódu co dělá ten assert? Kde jsou středníky, mezery a sloupce jakožto oddělovače?

Ještě jiný příklad z mého konfiguráku:

&2:HV -a:blur (5,4) -e:soft_light (5)

Parsování řádku má probíhat tak, že to nejdříve rozdělím na sloupce, pak sloupce na argumenty a pak hledám případné parametry v závorkách

Nahlásit jako SPAM
IP: 78.45.199.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 112 hostů

Podobná vlákna

Parsování souboru — založil cniry

Parsování php souboru — založil Konycz

Parsování do pole — založil georginho

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý