Pole reťazcov – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Pole reťazcov – C / C++ – Fórum – Programujte.comPole reťazcov – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Tomáš
~ Anonymní uživatel
511 příspěvků
7. 11. 2014   #1
-
0
-

void proc()
{

int i=0;
    char str[52];
    FILE *f;
    predaj = fopen("subor.txt", "r");
    char **udaje;
    if ((udaje = malloc(30 * sizeof(char *))) == NULL){
        printf("pamät fail");
        exit(1);
    }

        
    while ((fgets(str, 52, f)) != NULL){
        if ((udaje[i] = (char *)malloc(52)) == NULL){
            printf("pamät fail 2");
            exit(1);
        }               
        strcpy(udaje[i], str);
        i++;
    }

    for (i = 0; i < 30; i++) 
        free(udaje[i]);
    free(udaje);

}

po zavolaní tejto procedury mi to hadze error

Unhandled exception at 0x6B19FB53 (msvcr120d.dll) in PRPR PROJEKT 1.exe: 0xC0000005: Access violation reading location 0xCDCDCDCD.

prosím vás je tam niekde chyba? dakujem.

Nahlásit jako SPAM
IP: 95.102.205.–
Reklama
Reklama
Tomáš
~ Anonymní uživatel
511 příspěvků
7. 11. 2014   #2
-
0
-

predaj = fopen("subor.txt", "r");, tam je samozrejme f miesto predaj.. to len drobna chybicka pri kopirovani

Nahlásit jako SPAM
IP: 95.102.205.–
vitamin+8
Grafoman
7. 11. 2014   #3
-
0
-

#2 Tomáš

chybu mas asi tu:

 FILE *f;
 predaj = fopen("subor.txt", "r");
/// f je neinicializvane

edit:

//miesto:
if ((udaje = malloc(30 * sizeof(char *))) == NULL);

//pouzi:
char* udaje[30];

//alebo:
char udaje[30][52];

inak 0xCDCDCDCD znamena ze je hodnta neinicializvana (plati len v debug mde u msvc kmpilatru)

edit2:

zabudes uzatvarat subor a zabudes uvalnvat pamet pri niektorych chybach

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
7. 11. 2014   #4
-
0
-

Před prací se souborem je dobré si ověřit, že je opravdu otevřený. Příčin kvůli kterým otevření souboru selže může být několik.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:e447:a9...–
Tomáš
~ Anonymní uživatel
511 příspěvků
7. 11. 2014   #5
-
0
-

FILE *f; predaj = fopen("subor.txt", "r"); /// f je neinicializvane
tam nemam chybu, to som komentoval ze len preklep, 
char *[30] nepomaha. to je to iste len inak napisane :)

toto robim projekt z viac procedur, vlastne ešte nemam vyriešiene to ze v jednej procedure si otvorim ten subor a budem si ho posuvat otvoreny, a az potom v maine ho zatvorim. (preto mi tu chyba to zatvorenie) a subor mi to otvara to viem lebo ked dam kontrolny vypis na vypisanie obsahu toho pola, udaje vypise a potom hned error. a len pri citani zo suboru sa myslim nemaju ako stratit udaje v tom subore, takze to nie je az taka chyba ked to windows za mna zatvori.

a problem pretrvava, aj ked som vyskušal všetky vaše hinty :(

Nahlásit jako SPAM
IP: 95.102.205.–
Tomáš
~ Anonymní uživatel
511 příspěvků
7. 11. 2014   #6
-
0
-

sorry ze som nevyuzil  

tuto moznost

p.s. nevedomosť

 

Nahlásit jako SPAM
IP: 95.102.205.–
hlucheucho+10
Posthunter
7. 11. 2014   #7
-
0
-

kolik je řádků v souboru? opravdu 30?

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:e447:a9...–
vitamin+8
Grafoman
7. 11. 2014   #8
-
+1
-
Zajímavé

#6 Tomáš
Ked uz by si chcel pouzit tie zbytocne alokacie a chcel by si aj spravne dealokovat data pri chybach tak by si mohol pouzit nieco taketo:

void proc(){
    const int max_udaje_len = 30;
    const int max_data_size = 52;

    int udaje_len = 0;
    char str[max_data_size];
    char** udaje;
    FILE* file;

    if(!(file = fopen("data/subor.txt", "r"))){
        printf("subor fail");
        return;
    }

    if(!(udaje = (char**)malloc(max_udaje_len * sizeof(char*)))){
        printf("pamät fail");
        goto cleanup_file;
    }

    while(udaje_len < max_udaje_len && fgets(str, max_data_size, file)){
        if(!(udaje[udaje_len] = (char*)malloc(max_data_size))){
            printf("pamät fail");
            goto cleanup_malloc;
        }
        strcpy(udaje[udaje_len], str);
        ++udaje_len;
    }

    if(ferror(file)){
        printf("subor fail");
        goto cleanup_malloc;
    }

    for(int i = 0; i < udaje_len; ++i){
        printf("%d. %s\n", i, udaje[i]);
    }

cleanup_malloc:
    for(int i = 0; i < udaje_len; ++i){
        free(udaje[i]);
    }
    free(udaje);

cleanup_file:
    fclose(file);

}
Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
vrtkoo0
Newbie
7. 11. 2014   #9
-
0
-

uz som si spravil ucet, Tomáš=vrtkoo now :)

#8 vitamin
dík, funguje to. Kedže hovoris ze zbytocne alokacie? a ako by som to spravil bez nich? lebo bez nich mi to(povodna moja procedura) už vobec nefunguje, ani vypis.. (ale toto riešenie sa mi zide do dalšich procedur :) )

Nahlásit jako SPAM
IP: 95.102.205.–
vitamin+8
Grafoman
7. 11. 2014   #10
-
+1
-
Zajímavé

#9 vrtkoo
Cez staticke pole, potom ani nepotrebujes pomocnu premennu str, rovno budes zapisovat do toho pola.

void proc(){
    const int max_udaje_len = 30;
    const int max_data_size = 52;

    int udaje_len = 0;
    char udaje[max_udaje_len][max_data_size];
    FILE* file;

    if(!(file = fopen("data/subor.txt", "r"))){
        printf("subor fail");
        return;
    }

    while(udaje_len < max_udaje_len && fgets(udaje[udaje_len], max_data_size, file)){
        ++udaje_len;
    }

    if(ferror(file)){
        printf("subor fail");
        goto cleanup_file;
    }

    for(int i = 0; i < udaje_len; ++i){
        printf("%d. %s\n", i, udaje[i]);
    }

cleanup_file:
    fclose(file);
}
Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
vrtkoo0
Newbie
7. 11. 2014   #11
-
0
-

  #10 vitamin

 vdaka , toto je moja finalna verzia :) 

void proc()
{
	int i=0;
	
	FILE *subor;
	if ((subor = fopen("subor.txt", "r")) == NULL) {
		printf("neni otvoreny");	
		return;
	}
	char udaje[30][52];
		
	while ((fgets(udaje[i], 52, subor)) != NULL){
		i++;
	
	}
	for (i = 0; i < 30; i++){
		printf("%s", udaje[i]);
		
	}
	putchar('\n');
	
	fclose(subor);
}
Nahlásit jako SPAM
IP: 95.102.205.–
vitamin+8
Grafoman
7. 11. 2014   #12
-
0
-

#11 vrtkoo
ak bude v subore viac riadkov ako 30 tak si budes prepisovat data na stacku, preto tam treba mat este jednu podmienku:

while (i < 30 && (fgets(udaje[i], 52, subor)) != NULL){
	++i;
}
		

Radsej nepouzivaj magicke cisla.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
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, 64 hostů

Podobná vlákna

Dynamické pole reťazcov — založil gaben

Rovnosť reťazcov — založil Grungy

Spájanie reťazcov — založil Dodiq

Porovnávanie reťazcov — založil Kent

Moderátoři diskuze

 

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