Načtení konkrétního textu ze souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načtení konkrétního textu ze souboru – C / C++ – Fórum – Programujte.comNačtení konkrétního textu ze souboru – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
avalagne0
Newbie
2. 5. 2012   #1
-
0
-

Ahoj,

chtěl bych poprosit, zda by někdo nedokázal nějak jednoduše vytáhnout určitý text ze souboru, který mám... Měl jsem to u zkoušky a nějak jsem to úplně nedotáhl.

Přikládám odkaz na stažení toho textového souboru pro obrázek jak vypadal: http://uloz.to/xaetgNK/data-txt

Jde mi o vytažení textu co je za 2000... Tedy BACKOV, BARCHOV, BARTOSOVICE atd a to bez mezer zprava (jsou až po ^)...

Moje myšlenka byla asi taková:

Načetl jsem řádek pomocí fgets, pak jsem četl řádek po písmenech ve whilu a hlídal si index... Jak jsem byl na správném indexu (název začíná a končí vždy na stejných indexech), tak jsem si to uložil jako pole charů a pak se ho snažil oříznout zprava o ty mezery... Nevím jestli to nejde třeba nějak jednodušeji, v Javě je třeba možnost vytáhnutí "podstringu", kde se zadá jen index od - do... Ale tohle je Céčko...

Díky moc za rady! Bohužel ten kód nemám u sebe, tak píšu jen co si pamatuji jak jsem postupoval... Měl jsem tam nějakou chybu, tak bych se rád poučil.

Nahlásit jako SPAM
IP: 83.208.55.–
ingiraxo+15
Grafoman
2. 5. 2012   #2
-
0
-

Soubor data.txt je chráněn heslem.

jinak to je C nebo C++ ?

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
avalagne0
Newbie
2. 5. 2012   #3
-
0
-

#2 ingiraxo
Ještě že jsem na to myslel... Ať sem dám heslo... Heslo je: DataC ... A jedná se čistě o Jazyk C.

Nahlásit jako SPAM
IP: 83.208.55.–
ingiraxo+15
Grafoman
2. 5. 2012   #4
-
0
-

však to je jednoduchý, projdeš celej soubor po řádcích a budeš pársovat prvně číslo 2000, čím dostaneš pole o 2 prvcích, kde první je všechno předtim (to nepotřebuješ) a druhý je "mezera TEXT ...^", takže ted opět projedes parse ale na znak ^, kterej ukončuje TEXT a whoala, máš TEXT :D

Doporučuju parsovat podle char* tmp = strtok(str,delim);

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
avalagne0
Newbie
2. 5. 2012   #5
-
0
-

#4 ingiraxo
Tak nevim, po použití funkce strtok jak píšeš mi to nenabízí o moc lepší možnosti... Akorát tam není ta 2000ka...

Kód:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void nacti();

int main()
{
	nacti();

	return 0;
}

void nacti()
{
	FILE *f;
	char retezec[150];
	char* ret;

	f = fopen("data.txt", "r");


	while(!feof(f))
	{
		fgets(retezec, 150, f);
		ret = strtok(retezec, "2000");

		while(ret != NULL)
		{
			printf("%s", ret);
			ret = strtok(NULL, "2000");
		}
	}
	fclose(f);
}

Díky za radu...

EDIT: A navíc nevím jak chceš vyřešit třeba toto: BISKUPICE U JEVICKA

Nahlásit jako SPAM
IP: 83.208.55.–
Řešení
ingiraxo+15
Grafoman
3. 5. 2012   #6
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

Spíš takto nějak jsem to myslel.. jinak šlo by líp udělat zjištění velikosti pole dle počtu řádků v souboru (bez cyklu), ale to se mi dělat nechtělo už a taky se mi nechtělo odebírání mezer v těch názvech... to si už snad uděláš sám

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* parseMainPart(const char* delim, char* dest)
{
	char* res = strtok(dest, delim);
	return res ? res : 0;
}

char* parseWord(const char* delim, char* dest)
{
	char* res = strtok(dest, delim);
	char* last = 0;

	while (res)
	{
		last = res;
		res = strtok(0, delim);
	}
	return last ? last : 0;
}

void readFile(const char* file)
{
	FILE* f = fopen(file, "r");
	char buffer[1024];
	char* words[256];
	int i = 0;

	while (1)
	{
		char* line = fgets(buffer, sizeof(buffer), f);
		line = parseMainPart("^", line);
		line = parseWord("0", line);

		if (line)
		{
			*(words + i) = (char*) calloc(strlen(line), sizeof(char));
			strcpy(*(words + i++), line);
		}
		else break;
	}

	// ve "words" jsou vsechny nazvy s mezerama
}

int main()
{
	readFile("data.txt");

	getchar();
	return 0;
}
Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
avalagne0
Newbie
5. 5. 2012   #7
-
0
-

#6 ingiraxo
Díky moc za řešení! Určitě je to krásná názorná ukázka... Mezery nejsou problém, to si ořežu sám... Označuji jako vyřešené...

Nahlásit jako SPAM
IP: 83.208.55.–
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, 79 hostů

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ý