C programlama ''Segmentation Fault'' hatası

Katılım
12 Aralık 2015
Mesajlar
4.810
Makaleler
7
Çözümler
9
C:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct hasta_bilgi{
    char ad[20];
    char soyad[20];
    char hastalik[20];
    int no;
    int yas;
}hasta;

int main(){
   
    int a;
    int t;
    int i=0;
   
    FILE *hbs;
   
    printf("Islem secin:\n");
    scanf("%d",&a);
   
    switch(a){
        case 1: {
           
            hbs=fopen("hastabilgisistemi.txt","a+");
           
            printf("Hastane kayit sistemine hos geldiniz.\n");
               
           
            printf("%d. hastanin adini giriniz:\n",i+1);
            scanf("%s",hasta.ad);
           
           
            printf("%d. hastanin soyadini giriniz:\n",i+1);
            scanf("%s",hasta.soyad);
           
           
            printf("%d. hastanin hastaligini giriniz:\n",i+1);
            scanf("%s",hasta.hastalik);
           
           
            printf("%d. hastanin numarasini giriniz:\n",i+1);
            scanf("%d",&hasta.no);
           
           
            printf("%d. hastanin yasini giriniz:\n",i+1);
            scanf("%d",&hasta.yas);
           
           
            fprintf(hbs,"%s %s %s %d %d\n",hasta.ad,hasta.soyad,hasta.hastalik,hasta.no,hasta.yas);
           
            printf("Bilgiler eklendi.\n");
           
            fclose(hbs);
            break;
           
            }
           
    case 2:{
       
        hbs=fopen("hastabilgisistemi.txt","a+");
       
        printf("Hasta no: %d\n",hasta.no); // Hasta no'yu okumuyor kontrol için bu satır.

        fscanf(hbs,"%d\n",hasta.no);
        printf("Aramak istediginiz hastannin numarasini giriniz.\n");
        scanf("%d",&t);
       
        if(hasta.no==t){
            printf("Hastann adi: %s",hasta.ad);
            }
        break;
    }
   
}
    return 0;
}

Öncelikle Dev-C++ ile aynı kod hata da vermiyor ama sonuca da ulaşamıyorum. Online compiler ile deneyince de böyle bir hata alıyorum.

1653598913579.png


Bu da Dev-C++ ile oluşan çıktı:

case 1: ile kayıt alınıyor, problem yok.

1653598985280.png


case 2:

1653599020205.png


Bu da dosyaya yazdığının kanıtı:

1653599054584.png


Özetle konunun temelinde de eksiğim olabilir veya kodlarda bir hata olabilir. Ancak tespit edemedim ve ilerlememe engel teşkil ediyor bu durum.

Yapmak istedeğim şey de bir hasta bilgi sistemi. Bunun kayıt eklemek, silmek, numaradan hasta adı bulmak gibi şeyleri gerçekleştirmek istiyorum. Ne yazık ki sadece dosyaya yazmayı yapabildim...
 

Dynamics

Centipat
Katılım
23 Kasım 2021
Mesajlar
426
Çözümler
36
Yer
İzmir
Öyle kafana göre okuma/yazma yapamazsın, hangi sırayla yazdıysan o sırayla okuman gerekiyor.

Kayıtlı veri böyleyse;
Kod:
aaaaa tttt hhhhhhh 1111 55
bbbbb yyyy hhhhhhh 1111 66
ccccc ssss hhhhhhh 1111 88

Okumak için böyle kullanırsın.

C:
    FILE *pFile = fopen("hastabilgisistemi.txt", "r");

    struct hasta_bilgi h;
    
    while ( EOF != fscanf(pFile, "%s %s %s %d %d", h.ad, h.soyad, h.hastalik, &h.no, &h.yas) ) {

        printf("%s %s %s %d %d\n", h.ad, h.soyad, h.hastalik, h.no, h.yas);
    }
 
KS
KS
çokdüşünenbiri
Katılım
12 Aralık 2015
Mesajlar
4.810
Makaleler
7
Çözümler
9
Öyle kafana göre okuma/yazma yapamazsın, hangi sırayla yazdıysan o sırayla okuman gerekiyor.

Kayıtlı veri böyleyse;
Kod:
aaaaa tttt hhhhhhh 1111 55
bbbbb yyyy hhhhhhh 1111 66
ccccc ssss hhhhhhh 1111 88

Okumak için böyle kullanırsın.

C:
    FILE *pFile = fopen("hastabilgisistemi.txt", "r");

    struct hasta_bilgi h;
   
    while ( EOF != fscanf(pFile, "%s %s %s %d %d", h.ad, h.soyad, h.hastalik, &h.no, &h.yas) ) {

        printf("%s %s %s %d %d\n", h.ad, h.soyad, h.hastalik, h.no, h.yas);
    }
case 2'deki okuma satırını dediğiniz gibi yaptım ama hata alıyorum.

1653655843791.png


C:
    case 2:{
        
        hbs=fopen("hastabilgisistemi.txt","r");
    
        fscanf(hbs,"%s %s %s %d %d\n",hasta.ad,hasta.soyad,hasta.hastalik,hasta.no,hasta.yas);
    
        printf("Hasta no: %d\n",hasta.no);
    
        printf("Aramak istediginiz hastannin numarasini giriniz.\n");
        scanf("%d",&t);
        
        while ( EOF != fscanf(hbs, "%s %s %s %d %d", hasta.ad, hasta.soyad, hasta.hastalik, &hasta.no, &hasta.yas) )
        {
            if(hasta.no==t) {
                printf("%s %s %s %d %d\n", hasta.ad, hasta.soyad, hasta.hastalik, hasta.no, hasta.yas);
            }
            
        }
        break;
    }
 
KS
KS
çokdüşünenbiri
Katılım
12 Aralık 2015
Mesajlar
4.810
Makaleler
7
Çözümler
9
Maalesef çalışan hasta no'nun okunması imiş. Hasta no arama yapamıyorum ve while ve if blokları çalışmıyor ya da başka sorun var. Bu konuda tavsiyesi olan var mıdır ?
 

Dynamics

Centipat
Katılım
23 Kasım 2021
Mesajlar
426
Çözümler
36
Yer
İzmir
Son kodunu ve veri dosyasının içeriğini paylaş, yukarıda yaptığın işlemlerde de mantık hatası ve yazım yanlışı var, bunları geçtim böyle bir kayıt sistemi yapacaksan linked list türevi bir veri yapısı kullanmalısın, önce dosyadan verileri okuyup link list olarak belleğe aktaracaksın ardından arama, ekleme, çıkarma işlemlerini bu link list üzerinde yapıp bütün veriyi tekrar kaydedeceksin.
 
Yukarı