C programlama ''Segmentation Fault'' hatası

Katılım
12 Aralık 2015
Mesajlar
6.663
Makaleler
9
Çözümler
11
Daha fazla  
Sistem Özellikleri
i7 10750H || GTX 1660 Ti 6 GB Mobile || 2x16 GB RAM || 512 GB NVMe M.2 SSD || 1080p 144 Hz IPS Panel || Windows 11-macOS Big Sur || Acer Nitro 5 AN515-55 2020 ||
Cinsiyet
Erkek
Meslek
Öğrenci
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...
 
Site dosya oluştuma yazma okuma işlemlerinde sıkıntılı duruyor. Kendi bilgisayarınızda MinGW/GnuGCC kullanın.
 
Ö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);
    }
 
Ö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;
    }
 
Son düzenleme:
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 ?
 
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.
 

Geri
Yukarı