deskryptor pliku, błędny odczyt

deskryptor pliku, błędny odczyt
antoniaklja
  • Rejestracja:około 14 lat
  • Ostatnio:około 9 lat
  • Postów:88
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ć.

Kopiuj
#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

Kopiuj
1234532214
Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
0

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

edytowany 2x, ostatnio: Sopelek
antoniaklja
  • Rejestracja:około 14 lat
  • Ostatnio:około 9 lat
  • Postów:88
0

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

Kopiuj
Suma liczb parzystych w pliku: 274
Suma liczb nieparzystych w pliku: -1218151534 
edytowany 3x, ostatnio: antoniaklja
rincewind
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 8 lat
0

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

Kopiuj
int suma_parzysta = 0;
int suma_nieparzysta = 0;

Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
0
Kopiuj
#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

edytowany 2x, ostatnio: Sopelek
antoniaklja
  • Rejestracja:około 14 lat
  • Ostatnio:około 9 lat
  • Postów:88
0

Niestety po zainicjowaniu zmiennych nie ma poprawy.
Wynik:

Kopiuj
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.

edytowany 1x, ostatnio: antoniaklja
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 godziny
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

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.