Práce se soubory - hledání řetězce – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Práce se soubory - hledání řetězce – C / C++ – Fórum – Programujte.comPráce se soubory - hledání řetězce – C / C++ – Fórum – Programujte.com

 

Jaja
~ Anonymní uživatel
43 příspěvků
5. 12. 2012   #1
-
0
-

Zdravím zdravím,

prosím vás kdokoliv, jak můžu naprogramovat, aby uživatel mohl otevřít libovolný soubor? A jak se dá ze souboru zjistit kolikrát se určitý řetězec v souboru nachází?

Díky

Nahlásit jako SPAM
IP: 93.187.106.–
TheOndrap+2
Super člen
5. 12. 2012   #2
-
0
-

No můžeš to naprogramovat tak, že uživatele vyzveš k tomu, aby ti zadal url souboru, ten otevřeš a následně ho budeš prohledávat.

Promin, ale na takhle obecnou otázku jde dát jenom obecnou odpověď

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Jaja
~ Anonymní uživatel
43 příspěvků
5. 12. 2012   #3
-
0
-

#2 TheOndrap
V pohodě, to stačí. A mohl bys mi poradit jak to udělat?

A jak teda můžu spočítat kolikrát se v souboru nachází určitý řetězec? Dejme tomu třeba počet podmínek (tzn. řetezec if)

Nahlásit jako SPAM
IP: 93.187.106.–
TheOndrap+2
Super člen
5. 12. 2012   #4
-
0
-

k porovnávání řetězců existuje celá řada algoritmů, od složitějších po jednoduchý.

  • Musíš si v první řadě načíst obsah souboru, jestli celý najednou nebo po řádcích
  • Potom musíš ten tvůj "hledaný" porovnávat s tímhle načteným obsahem.
  • Ted záleží na tom v jakém prog. jazyce děláš, využít nějakou fci pro porovnávání řetězců

v nějakým pseudokodu by to bylo asi takhle:

//nacitani ze souboru radek po radku
while( konec_souboru){
	radek = nacti_radek(soubor);
	//strcmp porovnava 2 retezce
	if( strcmp( porovnavany, radka ) == 0 ){
		// v tuto chvili promenna "radek" obsahuje promennou "porovnavany"
	}
}
		
		
Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #5
-
0
-

#4 TheOndrap
Takže načítání pomocí funkce fgets?

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #6
-
0
-

#5 Jaja
chceš-li hledat řetězec o určité délce, budeš muset ze souboru číst řetězec o určité délce ;)

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #7
-
0
-

#6 CZechBoY
Já hlavně potřebuju vědět kde jakou funkci a cyklus použít :))

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #8
-
0
-
Nahlásit jako SPAM
IP: 213.192.10.–
CZechBoY+4
Věrný člen
6. 12. 2012   #9
-
0
-

#9 TheOndrap
nemůže číst řádek a srovnávat přes strcmp.. to mu nikdy nevyhodí 0, jedině že by hledal řádek

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #10
-
0
-

#8 CZechBoY
Výborně

A potom teda porovnávat můžu jak?

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #11
-
0
-

#10 Jaja
normálně přes strcmp(hledam, nacteno_ze_souboru)

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #12
-
0
-

#11 CZechBoY
Dobrá tedy.

A v té podmínce to nacteno_ze_souboru značí co? Vím, že je to řetězec, který chci porovnávat s tím prvním, ale netuším jak to zapsat.

Nahlásit jako SPAM
IP: 93.187.106.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #13
-
0
-

Když mám kód -

while(f != EOF){
        radek = fgets(a, 4, f);
        if(strcmp(main, radek) == 0 ){
		i++;
}

Asi bude spatně celý, ale to znamená že v té podmínce bude teda radek že ano?

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #14
-
0
-

#13 Jaja
pokud je proměnná main složená z 4 písmen tak to je správně

ale magické konstanty být tebou nepoužívám...

a používej spíš feof(f) než f == EOF

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #15
-
0
-

Super, už mě začíná opět něco osvicovat :))

A teda jak si výše psal, že to porovnávání nikdy nebude vracet 0, tak co s tím?

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #16
-
0
-

#15 Jaja
to znamenalo, že musí být ty stringy oba stejně dlouhé

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #17
-
0
-

Takže když porovnávám slovo main s něčím, co má v souboru 4 písmena, tak to pak funguje ano?

A ještě se chci zeptat, proměnná radek bude typu string? To znamená char[] radek?

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #18
-
0
-

#17 Jaja

char* hledam = "blablabla";

int delka = strlen(hledam);

char radek[delka+1];

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #19
-
0
-

Dobře, no, nějak jsem to vykutil a pořád tam mám něco špatně, ze soubory pracuju teď prvně, takže s tím mám trošku problém.

int main(){
    FILE *f;
    char* a = "main";
    int delka = strlen(a);
    char radek[delka+1];

    if((f = fopen("rovnice.txt", "r")) == NULL){
        printf("Chyba pri praci se souborem!");
        return 0;
    }

    while(feof(f)){
        radek = fgets(a, 4, f);
        if(strcmp(a, radek) == 0 ){
            i++;
    }

    printf("V souboru je %d funkci main: ", i);

    fclose(f);

    system("PAUSE");
    return 0;

}

Program se mi ani nespustí.

Nahlásit jako SPAM
IP: 93.187.106.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #20
-
0
-

zapomněl jsem tam ještě do deklarace dodat int i; :))

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #21
-
0
-

#19 Jaja
u toho feofu musí být samozřejmě negace :)

nespustí znamená nějaký error při kompilaci?

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #22
-
0
-

No spouštím to přes Code::Block a tam to chyby nehlásí, ale otevřu si to ve Visual Studio

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #23
-
0
-

#22 Jaja
to je stejný.. taky používám C::B

jestli není chyba při kompilaci ak kde je teda chyba?

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #24
-
0
-

Mě myslím ještě Code::Block chybu nevyhodil, ale to je jedno :))

Kde je chyba to nevím.

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #25
-
0
-

#24 Jaja
no říkáš že tam je chyba, ale už nezmiňuješ co to za chybu je

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #26
-
0
-

To ano, protože ji tam nevidím. To bude nějaká ta záludná chyba pro mě.

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #27
-
0
-

#26 Jaja
já pořád nechápu v čem je problém

co to dělá/nedělá?

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #28
-
0
-

No právě že to nedělá vůbec nic, program se ani nespustí. Když to zkompiluju ve VS, tak mi to tam hodí:

tady tohle jedině.

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #29
-
0
-

#28 Jaja
#include <string.h>

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #30
-
0
-

Jo, to by byla první a pak to tam háže ještě:

U řádků:

char radek[delka+1];

radek = fgets(a, 4, f);

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #31
-
0
-

#30 Jaja
fgets(radek, 4, f);

vypadá to, že VS je nějaký moc přísný..

tak to udělej přes dynamickou alokaci..

char* radek = malloc(strlen(delka) + 1);

až tu proměnnou nebudeš potřebovat tak tam někde dej příkaz free(radek);

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #32
-
0
-

Pořád se tomu něco nelíbí

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
6. 12. 2012   #33
-
0
-

#32 Jaja
kompiluj to přes gcc v codeblocks, VS si nějak moc stěžuje :D

nemáš to VS C++? nevim jestli to vadí...

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #34
-
0
-

Kompiluju a stejně to i tak nejede. Nemám rád C, už tam mi nadělalo moc problémů :D

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2012   #35
-
0
-

jak moc prisny?

pro lidi co nedokazou pochopit "cas kompilace" a "cas behu" to bude vzdy moc prisny... to ze tam mas predpripravenej staticke retezec na zaklade strlen jinyho retezce --- to ze to uz v gcc a podobne i projde je jen zmirnovani restrikci.. ale furt se to nemusi chovat spravne

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CZechBoY+4
Věrný člen
6. 12. 2012   #36
-
0
-

#35 KIIV
no jasný, ale proč ten malloc nejde? :D

#34 Jaja
ukaž jakej máš kod teď?

Nahlásit jako SPAM
IP: 213.192.10.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2012   #37
-
0
-

radek = fgets(a, 4, f);   - vraci "int" - jeden znak ... a tady se to snazi narvat do pointeru

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CZechBoY+4
Věrný člen
6. 12. 2012   #38
-
0
-

#37 KIIV
jj tam jsem mu psal ať to změní na fgets(radek, 4, f);

Nahlásit jako SPAM
IP: 213.192.10.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2012   #39
-
0
-

#38 CZechBoY
no proste zadnej prisnej prekladac... jen slabej programator :D

kazdopadne to chce aktualni kod at muzem rozcupovat ten

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
CZechBoY+4
Věrný člen
6. 12. 2012   #40
-
0
-

#39 KIIV
mě to je jasný že to neumim, dělám v tom jen školní projekty a jen pár měsíců :D

sice nás ve škole nutí použít nějaký striktní pravidla, ale stejně moc striktní nejsou :D (-pedantic -Wall -Wextra -W -std=c99)

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
6. 12. 2012   #41
-
0
-

Jsem teď mimo domov, napíšu vám zítra jak to jede.

Každopádně děkuju!

Nahlásit jako SPAM
IP: 178.72.192.–
Jaja
~ Anonymní uživatel
43 příspěvků
7. 12. 2012   #42
-
0
-

Tak:

int main(){
    FILE *f;
    char* a = "main";
    int delka = strlen(a);
    char* radek = malloc(strlen(delka) + 1);
    int i;

    if((f = fopen("rovnice.txt", "r")) == NULL){
        printf("Chyba pri praci se souborem!");
        return 0;
    }

    while(!feof(f)){
        radek = fgets(radek, 4, f);
        if(strcmp(a, radek) == 0 ){
            i++;
	}

    printf("V souboru je %d funkci main: ", i);

    free(radek);
    fclose(f);

    system("PAUSE");
    return 0;

}

Změnil jsem jen ten radek a porad to nejede. Já tomu prostě asi nerozumím.

Nahlásit jako SPAM
IP: 93.187.106.–
oplis10
Newbie
7. 12. 2012   #43
-
0
-

#42 Jaja
v tomto řádku

char* radek = malloc(strlen(delka) + 1);   máš v parametru fukce strlen proměnnou int, což je blbost, takže to má být

char* radek = malloc(delka + 1);

Co ti jinak nejede?

Nahlásit jako SPAM
IP: 195.212.199.–
Jaja
~ Anonymní uživatel
43 příspěvků
7. 12. 2012   #44
-
0
-

#43 oplis1
Jasně, děkuju .. No, pořád to nějak hapruje, hází mi to tam:

3 IntelliSense: a value of type "void *" cannot be used to initialize an entity of type "char *"

Nahlásit jako SPAM
IP: 93.187.106.–
oplis10
Newbie
7. 12. 2012   #45
-
0
-

#44 Jaja

Zkus to takhle

char *radek = (char*)malloc(delka + 1);

Nahlásit jako SPAM
IP: 195.212.199.–
Jaja
~ Anonymní uživatel
43 příspěvků
7. 12. 2012   #46
-
0
-

#45 oplis1
Jo, to už by šlo :)

Jen mi to ještě píše jakésik 2 chyby:

Warning 1 warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\www\dokumenty\visual studio 2010\projects\zkouska\zkouska\zkouska.c 17 1 zkouska

Error 2 error C1075: end of file found before the left brace '{' at 'c:\documents and settings\www\dokumenty\visual studio 2010\projects\zkouska\zkouska\zkouska.c(10)' was matched c:\documents and settings\www\dokumenty\visual studio 2010\projects\zkouska\zkouska\zkouska.c 38 1 zkouska

Příjde mi, jakoby to mělo problém s tím souborem, který chci otevřít.

Nahlásit jako SPAM
IP: 93.187.106.–
KIIV
~ Moderátor
+43
God of flame
7. 12. 2012   #47
-
0
-

#46 Jaja
prvni je warning...

druhy ti jasne rika ze nemas ukonceny nejaky blok { ... a to nemas.. (najdi si sam at se taky neco naucis)

dalsi chyba bude:  radek = fgets(radek, 4, f);   memory leak pokud se stane neco jineho nez uspech nebo EOF a fgets vrati NULL pointer

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jaja
~ Anonymní uživatel
43 příspěvků
7. 12. 2012   #48
-
0
-

#47 KIIV
Jo, tu chybějící svorku jsem přehlédl.

A s tou další chybou nevím, se soubory pracuji prvně.

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
7. 12. 2012   #49
-
0
-

#48 Jaja
dej tam fgets(radek, 4, f); však jsem to už psal (kdyžtak čti dokumentaci, co vrací ta funkce ne?)

s tim strlen(delka) se omlouvám, nějak jsem to překombinoval

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
8. 12. 2012   #50
-
0
-

Jo, dobře už to funguje, jen mi to hází špatný výsledek, ale s tím už si poradím.

Díky moc všem

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
9. 12. 2012   #51
-
0
-

#50 Jaja
špatný výsledek znamená přesněji co?

úplně z cesty nebo plus minus stejný?

Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
11. 12. 2012   #52
-
0
-

#51 CZechBoY
Úplně z cesty, pokud nastavím i = 0, tak mi to háže 0 a pokud to nechám bez nastavení, tak mi to háže nějaké šílené číslo.

Nahlásit jako SPAM
IP: 93.187.106.–
CZechBoY+4
Věrný člen
11. 12. 2012   #53
-
0
-

#52 Jaja
aha, tak jsem to vymyslel blbě :(

budeš to muset udělat, jako jsem já dělal teď osmisměrku :D

dobře, když jsem ti promrhal čas, tak jsem napsal funkci sám :)

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

int main(void){
    FILE *f;
    char* a = "main";
    int delkaSlova = strlen(a);
    int pis = 0;
    int i = 0;
    int tmp = 0;

    if((f = fopen("rovnice.txt", "r")) == NULL){
        printf("Chyba pri praci se souborem!");
        return 0;
    }

    while((pis = fgetc(f)) != EOF){
        if(pis == a[tmp]) {
            tmp++;
            if(tmp == delkaSlova) {
                i++;
                tmp = 0;
            }
        }
        else
            tmp = 0;
	}

    printf("V souboru je %d funkci main: ", i);

    fclose(f);

    system("PAUSE");
    return 0;
}
Nahlásit jako SPAM
IP: 213.192.10.–
Jaja
~ Anonymní uživatel
43 příspěvků
15. 12. 2012   #54
-
0
-

#53 CZechBoY
Výborně, děkuju mockrát!

Nahlásit jako SPAM
IP: 93.187.106.–
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, 151 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ý