Witam,
mam do napisania program w C, który w zależności od wybranej opcji (wpisanej jako parametr) ma wykonywać inną rzecz. Program ma mieć 4 opcje oznaczone jako "-i" (zamiana stdin z plikiem podanym jako kolejny argument, czyli rozumiem, że ma otwierać dany plik, pobierać znaki i wyświetlać je na ekran), "-o" (tak samo jak -i, tylko zamiast pobierać znaki, wpisujemy coś z klawiatury i zapisujemy do podanego w argumencie pliku), "-O" (podobnie jak -o ale tutaj dopisujemy, zamiast nadpisywać), "-q" (ignorowanie komunikatów o błędach). Czyli wywołanie programu w konsoli to przykładowo ./nazwa_programu -i plik1 -o plik2, albo np. ./nazwa_programu -i -O plik. No i udało mi się napisać coś takiego:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char *argv[]){
char s;
FILE *plik;
int i=1;
printf("%d\n",argc);
while(i<argc){
if(strcmp(argv[i],"-i")==0){
plik = fopen(argv[i+1],"r");
while(fscanf(plik,"%c",&s)!=EOF){
printf("%c",s);
}
fclose(plik);
}
if(strcmp(argv[i],"-o")==0){
plik = fopen(argv[i+1],"w");
while(s!='\n'){
scanf("%c",&s);
fprintf(plik,"%c",s);
}
fclose(plik);
}
if(strcmp(argv[i],"-O")==0){
plik = fopen(argv[i+1],"a");
while(s!='\n'){
scanf("%c",&s);
fprintf(plik,"%c",s);
}
fclose(plik);
}
i+=2;
}
if(argc==1){
printf("Wczytaj znaki: ");
while(1){
scanf("%c",&s);
printf("%c",s);
}
}
return 0;
}
no i generalnie każda z trzech opcji (-q jeszcze nie dodawałem) działa poprawnie, ale wyłącznie jeśli uruchamiamy program tylko z jedną opcją, czyli np. ./nazwa_programu -i plik, ale jak już chce dołączyć dowolną kolejną opcję to już nie działa tak jak trzeba. Jeśli np. uruchomię ./nazwa_programu -i plik1 -O plik1, to program pobierze z pliku plik1 znaki, wypisze je na ekran, ale już nie wykona drugiej opcji, czyli nie nadpisze potem do pliku plik1, tzn. w ogóle nie można potem już nic pisać z klawiatury w konsoli. I teraz moje pytanie brzmi, jak to można zmodyfikować, albo w ogóle napisać żeby można było te wszystkie opcje łączyć (wykonywać jedna po drugiej)? Poza tym sposób jaki zastosowałem w tym kodzie nie jest zbyt uniwersalny, bo na sztywno przyjąłem, że podczas wywołania zawsze będzie jakaś opcja i potem nazwa pliku, a więc dla indeksów nieparzystych mam te opcje, a dla parzystych pliki (w sensie w tablicy argv[]), ale jeśli miałbym np. wywołanie postaci ./nazwa_programu -o -i plik, to wtedy ten sposób nie zadziała, bo tam gdzie jest "-i" będzie chciał otwierać plik (to jest argv[2] - czyli indeks parzysty).
Także podsumowując przede wszystkim jak poprawić ten kod, aby móc wykonywać wszystkie podane opcje po sobie oraz ewentualnie jak zmodyfikować, aby ten program był bardziej uniwersalny? Dziękuję za wszelkie wskazówki