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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 4
včera 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 22
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 3
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 2
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 770 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: fopen Segmentation fault C

1.12.2011 18:45 stepan
fopen Segmentation fault C
Přečteno: 542×
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.