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
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ěď
k porovnávání řetězců existuje celá řada algoritmů, od složitějších po jednoduchý.
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"
}
}
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í.
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
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.
#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.
#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
#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;
}
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku