Witam, jestem nowym użytkownikiem forum a także osobą stawiającą pierwsze kroki w programowaniu w C. Mam za zadanie napisać program przetwarzający obrazy pgm. O ile same funkcje przetwarzające nie sprawiły mi większych problemów, to utknąłem w miejscu kiedy mam zrobić menu za pomocą funkcji switch w którym użytkownik może
- Wczytać obraz.
- Zakończyć działanie
Jeśli w czyta obraz, to powinno mu się pojawić 5 nowych opcji
1-4. jedna z funkcji przetwarzania - wczytanie innego obrazu czyli powrót do poprzedniej części menu.
Tej drugiej części zupełnie nie umiem napisać.
/* Menu które na razie ma tylko dwie funkcje */
int main() {
int obraz[MAX][MAX] ;
int wymx,wymy,odcienie;
int odczytano = 0;
FILE *plik;
char nazwa[100];
/* Wczytanie zawartosci wskazanego pliku do pamieci */
while(1>0)
{
printf("Program przetwarza obrazy pgm.\nWybierz akcję: \n1. Wczytaj obraz\n2. Zakończ\n");
int wybor;
scanf("%d",&wybor);
switch(wybor)
{
case 1:
printf("Podaj nazwe pliku:\n");
scanf("%s",nazwa);
plik=fopen(nazwa,"r");
if (plik != NULL) /* co spowoduje zakomentowanie tego warunku */
odczytano = czytaj(plik,obraz,&wymx,&wymy,&odcienie);
fclose(plik);
/* Wyswietlenie poprawnie wczytanego obraza zewnetrznym programem */
if (odczytano != 0)
wyswietl(nazwa);
return odczytano;
case 2:
printf("Program zakończył działanie.\n");
return 0;
default:
printf("Wybór nie poprawny!\n");
}
}
}
Drugim problemem z którym się zmagam to funkcja wczytująca te obrazy. Należy ją bowiem jakoś wyposażyć w to by omijała komentarz (zaczynać się on powinien od #). Udało mi się stworzyć coś co sprawdza czy pierwsza linijka jest komentarzem, jeśli jest to ją pomija, jeśli nie to wraca do jej początku i normalnie pozwala programowi ją przeczytać. Nie wiem jak sprawić by sprawdzała wszystkie linijki w poszukiwaniu tego # i później je odrzucała jeśli są zbędne.
/* Pominiecie komentarzy */
do {
if ((znak=fgetc(plik_we))=='#') { /* Czy linia rozpoczyna sie od znaku '#'? */
if (fgets(buf,DL_LINII,plik_we)==NULL) /* Przeczytaj ja do bufora */
koniec=1; /* Zapamietaj ewentualny koniec danych */
} else {
ungetc(znak,plik_we); /* Gdy przeczytany znak z poczatku linii */
} /* nie jest '#' zwroc go */
} while (znak=='#' && !koniec); /* Powtarzaj dopoki sa linie komentarza */
/* i nie nastapil koniec danych */
Jednak najważniejszą rzeczą jest zapisywanie pliku wyjściowego. Tu dostałem gotowy kod, który jednak nie wiem, chyba po prostu nadpisuje zmiany pliku wejściowego o ile wgle to robi, natomiast powinno zgodnie ze specyfikacją tworzyć nowy plik wyjściowy. Np wczytany zostanie obraz kubus.pgm, później coś tam mu się stanie i wyjściowo powinno być np. newkubus.pgm.
/* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
for (i=0;i<*wymy;i++) {
for (j=0;j<*wymx;j++) {
if (fscanf(plik_we,"%d",&(obraz_pgm[i][j]))!=1) {
fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
return(0);
}
}
}
return *wymx**wymy; /* Czytanie zakonczone sukcesem */
} /* Zwroc liczbe wczytanych pikseli */
Pilnie proszę o pomoc, ponieważ goni mnie termin oddania zadania. :( Z góry dziekuję za zainteresowanie tematem.
Draggie.