c - czytanie z pliku

0

Zadanie wygląda tak:
Napisz funkcję znajdującą największą z czterech liczb. Liczby przekazywane są jako argument wywołania funkcji w postaci struktury składającej się z czterech pól. Funkcja zwraca wartość największą z tych podanych w argumencie wywołania.
Przygotuj plik tekstowy zawierający w kolejnych linijkach po cztery liczby rzeczywiste. Napisz program, który będzie otwierał plik, wczytywał liczby z kolejnych wierszy pliku oraz dla każdej kolejnej wczytanej czwórki liczb wywoływał napisaną wcześniej funkcję. Zwróconą przez funkcję wartość, tj. największą z czterech liczb zapisanych w wierszu program od razu wyświetla w oknie konsoli.
Liczba wierszy w pliku powinna być dowolna, ale zakładamy, że nie ma wierszy uszkodzonych, tj. dane wejściowe są poprawne.

I to co udało mi się napisać:

#include <stdio.h>

struct liczba{
int a;
int b;
int c;
int d;
};

int najwieksza(struct liczba max);

int main(){

FILE *plik;
int i, naj;

if((plik=fopen("wynik.txt", "r"))==NULL){			//wynik.txt <- w nim siedza czworki liczb
	printf("Nie udalo sie wczytc pliku");
	return 0;
}
struct liczba max;									//zeruje wartosci poczatkowe max
max.a=0;			
max.b=0;
max.c=0;
max.d=0;

while(feof(plik)==0){								//pytania 1 i 2		
	fscanf(plik,"%d", max.a);
	fscanf(plik,"%d", max.b);
	fscanf(plik,"%d", max.c);
	fscanf(plik,"%d", max.d);
	naj=najwieksza(max);
	printf("Wynik to: %d\n", naj);

}

fclose(plik);
return 0;

}

int najwieksza(struct liczba max){
int maximum;
int i, c=0;
for(i=0;i<4;i++){ //prymitywny sposob na znalezienie maxa
if(max.a+i<max.a+i+1){
c=max.a+i+1;}
}
maximum=c;
return maximum;
}

Pytania:

  1. while(feof(plik)==0) czy taki warunek ma w ogóle jakiś sens ? chodzi o to że dopóki nie będzie eof to pętla się wykonuje.
  2. fscanf rozumiem tak, że wczytuje z pliku treść do spacji i kończy działanie czyli 4 fscanfy wczytują mi 1 wiersz (4 liczby)
  3. gdzie jest jakiś kluczowy błąd bo ten kod nie chce się za cholerę skompilować
    Pozdr.
0
  1. tak można krócej while(!feof(plik)) - znaczy to samo
  2. źle wczytujesz chyba. do scanfów podaje się adres, czyli wskaźnik: fscanf(plik,"%d",&(max.a));
    mogłeś załatwić to za jednym zamachem: fscanf(plik,"%d %d %d %d", &(max.a), &(max.b), &(max.c), &(max.d)) ;
  3. mi się wydaje, że w funkcji najwieksza() - nie masz tam tablicy, a stosujesz konstrukcję max.a+i.
    daj błąd jaki wywala
0

Dzięki wielkie & pomogło, tak obliczanie największej muszę rozwiązać inaczej bo dodawanie indeksów tu nie działa.

0
RJ napisał(a)

obliczanie największej muszę rozwiązać inaczej bo dodawanie indeksów tu nie działa.

polcecam zmienić strukturę:

struct liczba{
        int a[4];
};

int najwieksza(struct liczba max);

int main(){

        FILE *plik;
        int i, naj;

        if((plik=fopen("wynik.txt", "r"))==NULL){                        //wynik.txt <- w nim siedza czworki liczb
                printf("Nie udalo sie wczytc pliku");
                return 0;
        }
        struct liczba max;                                                                        //zeruje wartosci poczatkowe max
        
        //wlaściwie to nie wiem po co zerujesz, skoro i tak bedą zapisywane tam wartości

        while(feof(plik)==0){                                                                //pytania 1 i 2                
                fscanf(plik,"%d", max.a);
                fscanf(plik,"%d", (max.a+1));
                fscanf(plik,"%d", (max.a+2));
                fscanf(plik,"%d", (max.a+3));
                naj=najwieksza(max);
                printf("Wynik to: %d\n", naj);

        }
       
        fclose(plik);
        return 0;
}

int najwieksza(struct liczba max){
        int maximum=max.a[0];
        int i, c=0;
        for(i=1;i<4;i++){                                                 //prymitywny sposob na znalezienie maxa
                if(max.a[i]>maximum)
                        maximum=max.a[i];
        }
        return maximum;
}

0

zrobiłem to tak wcześniej:
int najwieksza(struct liczba max){
int maximum;
int i, c=0;
int tab[4];
tab[0]=max.a;
tab[1]=max.b;
tab[2]=max.c;
tab[3]=max.d;
...
}
ale zmiana struktury wydaje się być lepszym wyjściem.
Co do zerowania to nie jest potrzebne, na pewnym etapie pisania wywalało mi błędy wiec wyzerowałem i tak zostało.

0
rafal__ napisał(a)
  1. tak można krócej while(!feof(plik)) - znaczy to samo
    I jest tak samo błędne: http://www.gidnetwork.com/b-58.html
0
Azrael_Valedhel napisał(a)

I jest tak samo błędne: http://www.gidnetwork.com/b-58.html
Biblioteka standardowa C jest zwalona ma maksa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1