deskryptor pliku, błędny odczyt

0

Witam.
Piszę program odczytujący z pliku liczby parzyste i nieparzyste. Po wywołaniu funkcji fork() proces macierzysty liczy sumę liczb parzystych a proces potomny sumę liczb nieparzystych.
Niestety problem leży w funkcji "read" wydaje mi się, że błednie odczytuje znak po znaku..
Siedze nad tym dłuższy czas i nie mogę sobie poradzić.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

int main() {
	int fd;
	int pid;
	int bytes_parzysta;
	int bytes_nieparzysta;
	char liczba_parzysta;
	char liczba_nieparzysta;
	int suma_parzysta;
	int suma_nieparzysta;

	if( (fd = open("plik.txt", O_RDONLY)) == -1) {
		perror("open");
		exit(1);
	}

	if( (pid = fork()) == -1) {
		perror("fork");
		exit(1);
	} else if( pid > 0) {
		do {
			if( (bytes_parzysta = read(fd, &liczba_parzysta, 1)) == -1) {
				perror("read");
				exit(1);
			}
			if(liczba_parzysta == '\0')
				break;
			if(liczba_parzysta % 2 == 0) 
				suma_parzysta += liczba_parzysta;
		} while(bytes_parzysta != 0);		
		printf("Suma liczb parzystych w pliku: %d\n", suma_parzysta);
	} else if( pid == 0) {
		do {
                        if( (bytes_nieparzysta = read(fd, &liczba_nieparzysta, 1)) == -1) {
                                perror("read");
                                exit(1);
                        }
                        if(liczba_nieparzysta == '\0')
				break;
			if(liczba_nieparzysta % 2 != 0) 
                                suma_nieparzysta += liczba_nieparzysta;
                } while(bytes_nieparzysta != 0);
		printf("Suma liczb nieparzystych w pliku: %d\n", suma_nieparzysta);
	}	

	return 0;
} 

plik.txt w formacie

1234532214
0

napisz co nie działa, tzn. co się dzieje

0

wyniki działania programu są przekłamane, zwracają dużą wartość ujemną
kompilacja nawet z flagą -Wall nic nie zgłasza.

Suma liczb parzystych w pliku: 274
Suma liczb nieparzystych w pliku: -1218151534 
0

Nie inicjujesz zmiennych, więc suma nie ma prawa działać, bo zmienne mają śmieciowe wartości.

int suma_parzysta = 0;
int suma_nieparzysta = 0;
0
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
 
int main() {
        int fd;
        int pid;
        char liczba;
        int suma_parzysta;
        int suma_nieparzysta;
 
        if( (fd = open("plik.txt", O_RDONLY)) == -1) {
                perror("open");
                exit(1);
        }
 
        if( (pid = fork()) == -1) {
                perror("fork");
                exit(1);
        } else {
                while(!fd.eof())
                       {
                        read(fd, &liczba, 1)
                        if(liczba % 2 == 0) 
                                suma_parzysta += liczba_parzysta;
                        else 
                                suma_nieparzysta += liczba;
                        }           
                printf("Suma liczb parzystych w pliku: %d\n", suma_parzysta);
                printf("Suma liczb nieparzystych w pliku: %d\n", suma_nieparzysta);
                return 0;
       }
} 

nie sprawdzałem, ale powinno działać

chyba, że źle zrozumiałem założenia zadania

0

Niestety po zainicjowaniu zmiennych nie ma poprawy.
Wynik:

Suma liczb parzystych w pliku: 274
Suma liczb nieparzystych w pliku: 0 

Próbowałem także użyć funkcji atoi() w programie lecz nic nie zmienia.

0

Może pokaż przykład pliku?
Z tego co widzę plik jest typu .txt co sugeruje plik tekstowy, zaś odczyt masz binarny i zliczasz właściwie ilości parzystych czy nieparzystych bajtów.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.