abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 09:22 | Nová verze

    Monado, tj. multiplatformní open source implementace standardu OpenXR specifikujícího přístup k platformám a zařízením pro XR, tj. platformám a zařízením pro virtuální realitu (VR) a rozšířenou realitu (AR), bylo vydáno ve verzi 25.1.0. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    dnes 02:44 | Nová verze

    Byla vydána listopadová aktualizace aneb nová verze 1.107 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.107 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 0
    včera 19:22 | Zajímavý článek

    Pornhub zveřejnil podrobné statistiky za rok 2025. V části věnované zařízením a technologiím se lze dočíst, že 87 % přenášených dat směrovalo na telefony, 2 % na tablety a 11 % na desktopy. Operační systém Linux běžel na 6,3 % desktopů. O 22,4 % více než před rokem. Firefox má na desktopu 8,4 % podíl.

    Ladislav Hagara | Komentářů: 5
    včera 13:11 | Pozvánky

    Chcete vědět, co se odehrálo ve světě techniky za poslední měsíc? Nebo si popovídat o tom, co zrovna bastlíte? Pak dorazte na prosincovou Virtuální Bastlírnu s mikrofonem a kamerou, nalijte si něco k pití a ponořte se s strahovskými bastlíři do diskuze u virtuálního piva o technice i všem možném okolo. O čem budou tentokrát strahováci referovat? Téměř každý už si všiml významného zdražení RAM a SSD, jsou zde ale i příjemnější zprávy. Průša uvádí

    … více »
    bkralik | Komentářů: 0
    včera 12:55 | Bezpečnostní upozornění

    Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) podporuje vyjádření partnerů ze Spojeného království, kteří upozorňují na škodlivé aktivity společností Anxun Information Technology (též „I-S00N“) (pdf) a Beijing Integrity Technology (též „Integrity Tech“) působících v kyberprostoru a sídlících v Čínské lidové republice (ČLR). Tyto společnosti jsou součástí komplexního ekosystému soukromých subjektů v ČLR,

    … více »
    Ladislav Hagara | Komentářů: 8
    včera 04:55 | IT novinky

    Společnost Pebble představila (YouTube) prsten s tlačítkem a mikrofonem Pebble Index 01 pro rychlé nahrávání hlasových poznámek. Prsten lze předobjednat za 75 dolarů.

    Ladislav Hagara | Komentářů: 6
    včera 04:22 | IT novinky

    Společnost JetBrains v listopadu 2021 představila nové IDE s názvem Fleet. Tento týden oznámila jeho konec. Od 22. prosince 2025 již nebude možné Fleet stáhnout.

    Ladislav Hagara | Komentářů: 2
    9.12. 21:22 | Nová verze

    Byl vydán Mozilla Firefox 146.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 146 bude brzy k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    9.12. 17:00 | IT novinky

    Před rokem převzala Digitální a informační agentura (DIA) vlastnictví a provoz jednotné státní domény gov.cz. Nyní spustila samoobslužný portál, který umožňuje orgánům veřejné moci snadno registrovat nové domény státní správy pod doménu gov.cz nebo spravovat ty stávající. Proces nové registrace, který dříve trval 30 dní, se nyní zkrátil na několik minut.

    Ladislav Hagara | Komentářů: 7
    9.12. 11:33 | IT novinky

    IBM kupuje za 11 miliard USD (229,1 miliardy Kč) firmu Confluent zabývající se datovou infrastrukturou. Posílí tak svoji nabídku cloudových služeb a využije růstu poptávky po těchto službách, který je poháněný umělou inteligencí.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (34%)
     (47%)
     (19%)
     (17%)
     (22%)
     (15%)
     (24%)
     (16%)
     (18%)
    Celkem 451 hlasů
     Komentářů: 18, poslední 2.12. 18:34
    Rozcestník

    Dotaz: fopen Segmentation fault C

    1.12.2011 18:45 stepan
    fopen Segmentation fault C
    Přečteno: 771×
    Ahoj,

    dostal jsem se do úzkých. Nemůžu otevřít soubor, vždy mi to vypíše segmentation fault. Během kompilování gcc žádný warning ani chybu nevypíše, behěm spuštění bohužel SIGSEGV. Gdb mi chybu hlásí na řádku s
    FILE *p_f=fopen("soubor.txt","r+");
    , soubor přitom soubor existuje. Dále mám
    	if(p_f==NULL){
    		
    		printf("Chyba pri otevirani souboru\n");
    		fclose(p_f);
    		
    	}
    . Všechny potřebné knihovny jsou inkluovány, tak nevím kde je chyba. Googlem brázdím něco přes hodinu a půl a na nic jsem nepřišel. Jen jsem zjistil, že je tam potřeba použít fce malloc, bohužel jsem začátečník, tak nevím jak dál. Používám pro studium knihu od K&R. Díky všem za nápady.

    Řešení dotazu:


    Odpovědi

    1.12.2011 18:56 Radovan
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Jak chceš zavřít soubor, který se ti nepodařilo otevřít?

    Já to dělám takhle:
        if ((vstup=fopen("soubor.txt","r")))
           {
           /* zpracování ... */
           fclose(vstup);
           }
        else
           printf("Nelze otevřít soubor pro čtení!\n\a");
    
    1.12.2011 19:38 stepan
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Nevím, jaksi mi to nefunguje, to bude nejspíše tím, že tam používám ještě funkci fgets. Tady je to celé
    if ((vstup=fopen("soubor.txt","r"))) {
    		
          if((fgets(pointer,10000000,vstup))==NULL) {
    		
    			printf("Chyba 1 \n");	
    			
    		}
    		pointer=druhe_pole;
    		
    		if((fgets(pointer,10000000,vstup))==NULL) {
    		
    			printf("Chyba 2 \n");	
    		
    		}
    		
    		fclose(vstup);
    	}
       else {
           printf("Chyba pri otevirani souboru\n\a");
    	}
    Váš kód mi fungoval bezproblému, děkuji za něj, bohužel, i když jsem to spravil, nepomohlo to.
    1.12.2011 20:50 johniez | skóre: 17 | blog: xyz | Praha
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Co je pointer?
    1.12.2011 21:12 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    <joke>¿Obecně, nebo ta proměnná?</joke>
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    1.12.2011 21:10 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Bude problém v tom pointer, máte tam rezervováno místo pro 10 000 000 bytů (charů) na to dám krk :-)
    Jen jako ukázka, podle toho co se snažíte:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MY_SIZE (100000)
    
    //main.cpp
    int main(int argc, char **argv)
    {
      char *pointer = NULL;
      char *prvni_pole = NULL;
      char *druhe_pole = NULL;
      if((prvni_pole = (char*) malloc(sizeof(char) * MY_SIZE)) == NULL)
      {
        printf("Chyba 0-1, nedostatek paměti\n");
        exit(3);
      }
      if((druhe_pole = (char*) malloc(sizeof(char) * MY_SIZE)) == NULL)
      {
        printf("Chyba 0-2, nedostatek paměti\n");
        free(prvni_pole);
        exit(3);
      }
      //aspon
      prvni_pole[0] = druhe_pole[0] = 0x0;
      //nebo cela alokovana pamet:
      //memset(prvni_pole,0x0,MY_SIZE);
      //memset(druhe_pole,0x0,MY_SIZE);
    
      FILE *vstup;
      if ((vstup=fopen("soubor.txt","r")) == NULL) {
        printf("Chyba pri otevirani souboru\n");
        exit(3);
      }
    
      //ukazatel na první pole i když se m;že použít přímo prvni_pole
      pointer = prvni_pole;
    
      if((fgets(pointer,MY_SIZE,vstup))==NULL) {
        printf("Chyba 1 \n");
      }
    
      if(feof(vstup)){
        printf("Chyba uz tam teho vice není\n");
      }
      else
      {
        //ukazatel na druhe pole  i když se může použít přímo druhe_pole
        pointer=druhe_pole;
        if((fgets(pointer,MY_SIZE,vstup))==NULL) {
          printf("Chyba 2 \n");
        }
      }
    
      //obvykle netestuje návratovou hodnotu
      fclose(vstup);
    
      printf("prvni_pole: %s\n",prvni_pole);
      printf("druhe_pole: %s\n",druhe_pole);
    
      //neuskodi
      pointer=NULL;
    
      if(prvni_pole != NULL)//fcil zbytecne
        free(prvni_pole);
      //mozna dobry navyk
      prvni_pole=NULL;
    
      if(druhe_pole != NULL)//fcil zbytecne
        free(druhe_pole);
      //mozna dobry navyk
      druhe_pole=NULL;
    
      return 0;
    }
    
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    2.12.2011 11:09 Mr.S1lent.cz
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Proc proboha alokujes pole dynamicky? Dynamicka alokace je mnohem pomalejsi, nez staticka. Co ti brani v tom, pouzit
    char prvni_pole[MY_SIZE];
    
    ?

    Dynamicke alokaci se snazi clovek co nejvice vyhnout...
    2.12.2011 12:20 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Proc proboha alokujes pole dynamicky?
    Protože 20MB (dle původního dotazu) nechci jinak.
    Dynamicka alokace je mnohem pomalejsi, nez staticka.
    Rozdíl rychlosti alokace bude neměřitelný a výsledek možná opačný pokud proměnné budou mimo fci main.
    Co ti brani v tom, pouzit…
    Brání mi rozum a ohled na ostatní.
    Dynamicke alokaci se snazi clovek co nejvice vyhnout...
    Dle této definice nejsem člověk :-) (nebudu se ji vyhýbat za každou cenu), ale vidím to spíše tak, že rozumný programátor použijte to, co je v daném případě lepší a ví kde a jak se, která „rezervace paměti“ provádí…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    2.12.2011 13:10 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Vzhledem k tomu, že v první ukázce bylo MY_SIZE 10^7, nepřipadá mi statická alokace na zásobníku jako dobrý nápad. Pro těch 10^5 by to asi občas i fungovalo, ale stejně je to dost ošklivý zlozvyk.
    2.12.2011 14:05 stepan
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Díky, až budu doma, tak hned ten program vyzkouším. Pak dám vědět, díky zatím všem co pomohli.
    2.12.2011 18:33 stepan
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Díky všem, tuhle diskusi bych chtěl uzavřít. Problém se mi podařilo vyřešit, hlavní problém byl v tom, že jsem staticky alokoval moc velké pole a špatně closnul soubor. Děkuji všem za hodnotné příspěvky, zase jsem o něco zkušenější a snad už příště podobnou chybu neudělám.
    2.12.2011 06:50 Radovan
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    A ukazuje ti ten pointer při prvním čtení na prvni_pole?

    Mimochodem, opravdu si cpeš do paměti dvě desetimegabajtová statická pole? :-D
    2.12.2011 13:52 stepan
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Ano, ukazuje. Velikost toho pole je nutná, menší nepřipadá v úvahu.
    2.12.2011 14:16 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Pokud ano v 99 % případech, použijete dynamickou alokaci.

    PS: provokativní otázka: „¿Proč?“
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    rADOn avatar 2.12.2011 14:36 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Nevím co s tím chcete provádět, ale hádal bych že je to zralé na mmap()
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    1.12.2011 19:03 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    p_f = NULL, takze to spadne na fclose(p_f)
    1.12.2011 19:41 stepan
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    Aha, tak to já jsem myslel, že i když fopen vrátí hodnotu NULL tak budu muset nějak "odpojit" ten soubor - čili že bude vlastně připojeno "nic".
    frEon avatar 1.12.2011 20:41 frEon | skóre: 40 | Praha
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    prave, ze to "nic" se spatne zavira :-) pokud se na to chces koukat takhle...
    Talking about music is like dancing to architecture.
    martin-ux avatar 1.12.2011 21:34 martin-ux | skóre: 18 | Bratislava
    Rozbalit Rozbalit vše Re: fopen Segmentation fault C
    tak, ako ti povedal @kovariadam, zavriet mozes len ten file, ktory bol otvoreny. mozes to dokonca sklbit do jednej podmienky, napr:
            FILE *fp;
    
            if ((fp = fopen("myfile", "r")) == NULL ) {
                    perror("unable to open file");
                    return -1;
            }
            /* praca so suborom a nasledne close */
            fclose(fp);
            return 0;
    
    
    pri uceni je vhodne pouzit aj debugger, napriklad gdb. google ti da vela quick howto ako co .. v tvojom pripadne napriklad:
    
    $ gcc -g -o atest test.c
    $ ./atest
    attempt to close empty null handle
    Segmentation fault: 11 (core dumped)
    $
    
    $ gdb ./atest atest.core
    GNU gdb 6.1.1 [FreeBSD]
    --[snip]--
    
    (gdb) where
    #0  0x0000000800719e37 in fclose () from /lib/libc.so.7
    #1  0x0000000000400686 in main () at test.c:8
    
    (gdb) list 8
    3       int main() {
    4               FILE *p_f = fopen("soubor.txt","r+");
    5
    6               if(p_f == NULL ) {
    7                       fprintf(stderr, "attempt to close empty null handle\n");
    --- vystup z where ->  8                       fclose(p_f);  
    9               }
    10
    11              return 0;
    12      }
    
    
    kde atest je tvoj spustitelny program, core file sa vygeneroval po segfaulte.
    ..when you do things right, people won't be sure you've done anything at all..

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.