Çö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
701
Çö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;
}

Technopat Haberler

Geri
Yukarı