Çözüldü C ile metin dosyasındaki sayıları okuma ve işleme

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

atprk

Kilopat
Katılım
31 Ekim 2017
Mesajlar
693
Çözümler
4
Şimdi bir metin dosyası var ve bu metin dosyasında 100 tane satır var her satır 4 sütunlu ve bu sütunlardan biri satırın sayısını biri sıcaklığı diğeri büyüklüğü gibi şeyleri ifade ediyor. Benim amacım ise program satırları ve sütunları okuyacak bulduğu en düşük sıcaklık değeri yazacak ve kaçıncı satırda olduğunu söyleyecek. Yapmak istediğim şey genel olarak böyle bir şey daha kodlama da yeni olduğum için yavaş yavaş çözmeye çalışıyorum daha şimdilik metin dosyasını okutmayı başardım ve en düşük sayıyı bulmaya çalışıyorum ancak başka bir şey buluyor. Satır sayısını nasıl bulduracağım ve satır satır okutup nasıl sütunlara ayırabilirim?
Kod:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    int num, min = 0, max = 0, sum, line, first;
    printf("Enter filename\n");
    char str[100];
        scanf("%s",str);
        fp=fopen(str,"r");
        if (fp != NULL)
        {
            for (sum = line = first = 0;
            fscanf(fp, "%d", &num) == 1; sum += num, line++)
                if (!first)
                {
                    min = max = num; first = 1;
                }
                else if (num > max) max = num;
                else if (num < min) min = num;
            fclose(fp);
        printf("line = %d, min = %d, max = %d, sum = %d, avg = %.1lf\n",
                line, min, max, sum, sum / (double) line);
 

        }
        else
        {
        printf("Unable to read file\n" );
        }
    return 0;
}
 
Çözüm
Formatlara dikkat ederek oku ya da yazdır, o zaman problem olmaz.

Böyle çalışması lazım.

C:
#include <stdio.h>


void compare(int line, float v, float *max, float *min,  int *max_line, int *min_line) {
      
        if( v > *max) {
            *max = v;
            *max_line = line;
        }

        if( v < *min ) {
            *min = v;
            *min_line = line;
        }       

}

int main( void ) {

    FILE *pFile = fopen("data.txt", "r");

    if ( !pFile) {
        
        perror("error");
        return -1;
    }
    
    float s, t, h, r ,w;
    float s_max=0, t_max=0, h_max=0, r_max=0, w_max=0;
    float s_min=9999, t_min=9999, h_min=9999, r_min=9999, w_min=9999;

    int s_max_line=0, t_max_line=0, h_max_line=0, r_max_line=0, w_max_line=0;
    int s_min_line=0, t_min_line=0, h_min_line=0, r_min_line=0, w_min_line=0;

    int line =0;

    while ( EOF != fscanf(pFile, "%f %f %f %f %f", &s, &t, &h, &r, &w) ) {

        compare(line, s, &s_max, &s_min, &s_max_line, &s_min_line);
        compare(line, t, &t_max, &t_min, &t_max_line, &t_min_line);
        compare(line, h, &h_max, &h_min, &h_max_line, &h_min_line);
        compare(line, r, &r_max, &r_min, &r_max_line, &r_min_line);
        compare(line, w, &w_max, &w_min, &w_max_line, &w_min_line);

        printf("%d. line: %.f %.f %.f, %.2f, %.f\n", line, s, t, h, r, w);
        line++;
    }

    printf("s_max_line:%d s_max_val:%.2f, s_min_line:%d, s_min_val:%.2f\n", s_max_line, s_max, s_min_line, s_min);
    printf("t_max_line:%d t_max_val:%.2f, t_min_line:%d, t_min_val:%.2f\n", t_max_line, t_max, t_min_line, t_min);
    printf("h_max_line:%d h_max_val:%.2f, h_min_line:%d, h_min_val:%.2f\n", h_max_line, h_max, h_min_line, h_min);
    printf("r_max_line:%d r_max_val:%.2f, r_min_line:%d, r_min_val:%.2f\n", r_max_line, r_max, r_min_line, r_min);
    printf("w_max_line:%d w_max_val:%.2f, w_min_line:%d, w_min_val:%.2f\n", w_max_line, w_max, w_min_line, w_min);

    fclose (pFile);

    return 0;
}
Zaten formatlı okuma yapıyorsun, fscanf fonksiyonunu istediğin formatta ayarlayabilirsin.

Elimizde böyle bir veri var diyelim.

Kod:
10 11 12 13
14 15 16 17
18 19 20 21

Bunu okumak için fscanf fonksiyonunu aşağıdaki gibi kullanırız.

C:
#include <stdio.h>

int main( void ) {

    FILE *pFile = fopen("data.txt", "r");

    if ( !pFile) {
        
        perror("error");
        return -1;
    }

    int v1, v2, v3, v4;

    while ( EOF != fscanf(pFile, "%d %d %d %d", &v1, &v2, &v3, &v4) ) {

        printf("%d %d %d %d\n", v1, v2, v3, v4);

    }

    fclose (pFile);

    return 0;
}
 
Zaten formatlı okuma yapıyorsun, fscanf fonksiyonunu istediğin formatta ayarlayabilirsin.

Elimizde böyle bir veri var diyelim.

Kod:
10 11 12 13
14 15 16 17
18 19 20 21

Bunu okumak için fscanf fonksiyonunu aşağıdaki gibi kullanırız.

C:
#include <stdio.h>

int main( void ) {

    FILE *pFile = fopen("data.txt", "r");

    if ( !pFile) {
       
        perror("error");
        return -1;
    }

    int v1, v2, v3, v4;

    while ( EOF != fscanf(pFile, "%d %d %d %d", &v1, &v2, &v3, &v4) ) {

        printf("%d %d %d %d\n", v1, v2, v3, v4);

    }

    fclose (pFile);

    return 0;
}
Çok teşekkür ederim kendime göre uyarladım ve bir sıkıntı olmuyor. Peki diğer dediğim şey olan sütundaki minimum ve maksimum sayıyı bulup kaçıncı satırda olduğunu söylemesini nasıl yapabiliriz yardımcı olabilir misin?
 
While döngüsü zaten sana satır sayısını veriyor bir değisken tanımlayıp her döngüde bir arttırarak bulabilirsin, min maks olayını söylememe gerek yok herhalde basit bir if yordamıyla kontrol edersin, bulduğun değerleri de döngü dışında değişkenlere kaydedersin eğer yeni satırdakiler kaydettiğin değerlerden daha büyük ya da küçükse bunları güncellersin vs..
 
While döngüsü zaten sana satır sayısını veriyor bir değisken tanımlayıp her döngüde bir arttırarak bulabilirsin, min maks olayını söylememe gerek yok herhalde basit bir if yordamıyla kontrol edersin, bulduğun değerleri de döngü dışında değişkenlere kaydedersin eğer yeni satırdakiler kaydettiğin değerlerden daha büyük ya da küçükse bunları güncellersin vs..
Birinci kod sizin verdiğiniz kodu olan satır satır tarama kodu, ikinci kod ise satır sayısını bulan ve minimum maksimum sayısını bulan kod ancak iki kodu birleştiremiyorum. Yapmak istediğim dört sütunu da tek tek tarayacak ve her sütundaki minimum ve maximum sayının kaçıncı satırda olduğunu yazdırmak. Kusura bakmayın yine sizin yardımınıza başvurmak istiyorum. Yardımcı olursanız çok teşekkür ederim.
C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    int s, t, h, w;
    int c = 0,nl=0;
    float r;
    printf("Enter filename\n");
    char str[196];
    scanf("%s",str);
    fp=fopen(str,"r");
    
    
    if (fp == NULL)
        {
            printf("Unable to read file\n" );
        }
    
    else if (fp != NULL)
        {
                
    while ( EOF != fscanf(fp, "%d %d %d %f %d", &s, &t, &h, &r, &w) )
        {
            printf("%d %d %d %.2f %d\n", s, t, h, r, w);
        }
        }
    printf("satır sayısı= ",nl);
    fclose(fp);
    return 0;
}

Kod:
 else if (fp != NULL)
        {
            for (sum = first = 0; fscanf(fp, "%d", &num) == 1; sum += num)
                if (!first)
                {
                    min = max = num; first = 1;
                }
            
                else if (num > max) max = num;
                else if (num < min) min = num;
            
                c=getc(fp);
                while(c!=EOF)
                {
                if(c=='\n')
                nl++;
                c=getc(fp);
        }
 
Şöyle bir şey yapabilirsin, diğerlerini de aynı şekilde eklersin.

C:
   //(0, 100) için
    
    int s, t;

    int s_max=0, t_max=0;
    int s_min=100, t_min=100;

    int s_max_line=0, t_max_line=0;
    int s_min_line=0, t_min_line=0;

    int line =0;

    while ( EOF != fscanf(pFile, "%d %d", &s, &t) ) {

        if( s > s_max) {
            s_max = s;
            s_max_line = line;
        }

        if( s < s_min ) {
            s_min = s;
            s_min_line = line;
        }     

        printf("%d %d\n", s, t);
        line++;
    }

    printf("s_max_line:%d s_max_val:%d, s_min_line:%d, s_min_val:%d\n", s_max_line, s_max, s_min_line, s_min);
 
Kod:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    int s, t, h, r, w;

    int s_max=0, t_max=0;
    int h_max=0, r_max=0;
    int w_max=0;
    
    int s_min=196, t_min=196;
    int h_min=196, r_min=196;
    int w_min=196;
    
    int s_max_line=0, t_max_line=0;
    int s_min_line=0, t_min_line=0;
    int h_max_line=0, r_max_line=0;
    int h_min_line=0, r_min_line=0;
    int w_max_line=0;
    int w_min_line=0;
    
    int line =0;
    
    
    printf("Enter filename\n");
    char str[196];
    scanf("%s",str);
    fp=fopen(str,"r");
    
    
    while ( EOF != fscanf(fp, "%d %d %d %d %d", &s, &t, &h, &r, &w) ) {

        if( s > s_max) {
            s_max = s;
            s_max_line = line;
        }
        if( s < s_min ) {
            s_min = s;
            s_min_line = line;
        }

        if( t > t_max) {
            t_max = t;
            t_max_line = line;
        }
        if( t < t_min ) {
            t_min = t;
            t_min_line = line;
        }
        
        if( h > h_max) {
            h_max = h;
            h_max_line = line;
        }
        if( h < h_min ) {
            h_min = h;
            h_min_line = line;
        }
        
        if( r > r_max) {
            r_max = r;
            r_max_line = line;
        }
        if( r < r_min ) {
            r_min = r;
            r_min_line = line;
        }
        
        if( w > w_max) {
            w_max = w;
            w_max_line = line;
        }
        if( w < w_min ) {
            w_min = w;
            w_min_line = line;
        }
        fclose(fp);
        printf("%d %d %d %d %d\n", s, t, h, r, w);
                line++;
        

        
        }
    printf("s_max_line:%d s_max_val:%d, s_min_line:%d, s_min_val:%d\n", s_max_line, s_max, s_min_line, s_min);
    
    printf("t_max_line:%d t_max_val:%d, t_min_line:%d, t_min_val:%d\n", t_max_line, t_max, t_min_line, t_min);
    
    printf("h_max_line:%d h_max_val:%d, h_min_line:%d, h_min_val:%d\n", h_max_line, h_max, h_min_line, h_min);
    
    printf("r_max_line:%d r_max_val:%d, r_min_line:%d, r_min_val:%d\n", r_max_line, r_max, r_min_line, r_min);
    
    printf("w_max_line:%d w_max_val:%d, w_min_line:%d, w_min_val:%d\n", w_max_line, w_max, w_min_line, w_min);


    return 0;
}

Böyle yaptım mantıken olması lazım ama verdiği sonuçlar böyle.
Kod:
Enter filename
data.txt

1001 16 83 29 1
s_max_line:0 s_max_val:1001, s_min_line:0, s_min_val:196
t_max_line:0 t_max_val:16, t_min_line:0, t_min_val:16
h_max_line:0 h_max_val:83, h_min_line:0, h_min_val:83
r_max_line:0 r_max_val:29, r_min_line:0, r_min_val:29
w_max_line:0 w_max_val:1, w_min_line:0, w_min_val:1
Program ended with exit code: 0

İstediğim şey tam olarak aşağıdaki gibi.
Yukarıdaki koda göre aşağıdaki gibi çıkması lazım ama nerede hata yapıyorum acaba.
Ekran Resmi 2022-05-24 11.34.20.png
 

Dosya Ekleri

  • DATA.TXT
    4 KB · Görüntüleme: 32
Formatlara dikkat ederek oku ya da yazdır, o zaman problem olmaz.

Böyle çalışması lazım.

C:
#include <stdio.h>


void compare(int line, float v, float *max, float *min,  int *max_line, int *min_line) {
      
        if( v > *max) {
            *max = v;
            *max_line = line;
        }

        if( v < *min ) {
            *min = v;
            *min_line = line;
        }       

}

int main( void ) {

    FILE *pFile = fopen("data.txt", "r");

    if ( !pFile) {
        
        perror("error");
        return -1;
    }
    
    float s, t, h, r ,w;
    float s_max=0, t_max=0, h_max=0, r_max=0, w_max=0;
    float s_min=9999, t_min=9999, h_min=9999, r_min=9999, w_min=9999;

    int s_max_line=0, t_max_line=0, h_max_line=0, r_max_line=0, w_max_line=0;
    int s_min_line=0, t_min_line=0, h_min_line=0, r_min_line=0, w_min_line=0;

    int line =0;

    while ( EOF != fscanf(pFile, "%f %f %f %f %f", &s, &t, &h, &r, &w) ) {

        compare(line, s, &s_max, &s_min, &s_max_line, &s_min_line);
        compare(line, t, &t_max, &t_min, &t_max_line, &t_min_line);
        compare(line, h, &h_max, &h_min, &h_max_line, &h_min_line);
        compare(line, r, &r_max, &r_min, &r_max_line, &r_min_line);
        compare(line, w, &w_max, &w_min, &w_max_line, &w_min_line);

        printf("%d. line: %.f %.f %.f, %.2f, %.f\n", line, s, t, h, r, w);
        line++;
    }

    printf("s_max_line:%d s_max_val:%.2f, s_min_line:%d, s_min_val:%.2f\n", s_max_line, s_max, s_min_line, s_min);
    printf("t_max_line:%d t_max_val:%.2f, t_min_line:%d, t_min_val:%.2f\n", t_max_line, t_max, t_min_line, t_min);
    printf("h_max_line:%d h_max_val:%.2f, h_min_line:%d, h_min_val:%.2f\n", h_max_line, h_max, h_min_line, h_min);
    printf("r_max_line:%d r_max_val:%.2f, r_min_line:%d, r_min_val:%.2f\n", r_max_line, r_max, r_min_line, r_min);
    printf("w_max_line:%d w_max_val:%.2f, w_min_line:%d, w_min_val:%.2f\n", w_max_line, w_max, w_min_line, w_min);

    fclose (pFile);

    return 0;
}
 
Çözüm
Kod:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    int s, t, h, r, w;

    int s_max=0, t_max=0;
    int h_max=0, r_max=0;
    int w_max=0;
   
    int s_min=196, t_min=196;
    int h_min=196, r_min=196;
    int w_min=196;
   
    int s_max_line=0, t_max_line=0;
    int s_min_line=0, t_min_line=0;
    int h_max_line=0, r_max_line=0;
    int h_min_line=0, r_min_line=0;
    int w_max_line=0;
    int w_min_line=0;
   
    int line =0;
   
   
    printf("Enter filename\n");
    char str[196];
    scanf("%s",str);
    fp=fopen(str,"r");
   
   
    while ( EOF != fscanf(fp, "%d %d %d %d %d", &s, &t, &h, &r, &w) ) {

        if( s > s_max) {
            s_max = s;
            s_max_line = line;
        }
        if( s < s_min ) {
            s_min = s;
            s_min_line = line;
        }

        if( t > t_max) {
            t_max = t;
            t_max_line = line;
        }
        if( t < t_min ) {
            t_min = t;
            t_min_line = line;
        }
       
        if( h > h_max) {
            h_max = h;
            h_max_line = line;
        }
        if( h < h_min ) {
            h_min = h;
            h_min_line = line;
        }
       
        if( r > r_max) {
            r_max = r;
            r_max_line = line;
        }
        if( r < r_min ) {
            r_min = r;
            r_min_line = line;
        }
       
        if( w > w_max) {
            w_max = w;
            w_max_line = line;
        }
        if( w < w_min ) {
            w_min = w;
            w_min_line = line;
        }
        fclose(fp);
        printf("%d %d %d %d %d\n", s, t, h, r, w);
                line++;
       

       
        }
    printf("s_max_line:%d s_max_val:%d, s_min_line:%d, s_min_val:%d\n", s_max_line, s_max, s_min_line, s_min);
   
    printf("t_max_line:%d t_max_val:%d, t_min_line:%d, t_min_val:%d\n", t_max_line, t_max, t_min_line, t_min);
   
    printf("h_max_line:%d h_max_val:%d, h_min_line:%d, h_min_val:%d\n", h_max_line, h_max, h_min_line, h_min);
   
    printf("r_max_line:%d r_max_val:%d, r_min_line:%d, r_min_val:%d\n", r_max_line, r_max, r_min_line, r_min);
   
    printf("w_max_line:%d w_max_val:%d, w_min_line:%d, w_min_val:%d\n", w_max_line, w_max, w_min_line, w_min);


    return 0;
}

Böyle yaptım mantıken olması lazım ama verdiği sonuçlar böyle.
Kod:
Enter filename
data.txt

1001 16 83 29 1
s_max_line:0 s_max_val:1001, s_min_line:0, s_min_val:196
t_max_line:0 t_max_val:16, t_min_line:0, t_min_val:16
h_max_line:0 h_max_val:83, h_min_line:0, h_min_val:83
r_max_line:0 r_max_val:29, r_min_line:0, r_min_val:29
w_max_line:0 w_max_val:1, w_min_line:0, w_min_val:1
Program ended with exit code: 0

İstediğim şey tam olarak aşağıdaki gibi.
Yukarıdaki koda göre aşağıdaki gibi çıkması lazım ama nerede hata yapıyorum acaba.
Eki Görüntüle 1397924
Buradaki mantık hatası while içinde "s_max_line= line" yerine "s_max_line=s" yaparak sorunu çözdüm ama sizim verdiğiniz kod daha çok işime yaradı. Çok teşekkür ederim.
 
s_max_line=s yaparsan s değerini kaydeder o değişkenin line değerini alması gerekiyor, sonuçta sayının maksimum değerinin hangi satırda olduğunun kaydı bu.
 

Yeni konular

Geri
Yukarı