Wywołanie programu z arg. wywołania lub przekierowanie strumienia jednoczesnie

0

Mam do napisania program, który można jednocześnie wywołać z argumentami wywołania, jak i przekierowaniem strumienia wyjściowego z pliku na wejście programu tj. :

./prog < plik.txt
albo

./prog plik.txt
Program MA SAM rozpoznawać, która opcja została użyta.

Próbowałem tak :

int main(int argc, char* argv[])
{
	
cout << " Chcesz wczytywać z : " <<argv[1][0]<<endl;
	// gdy wywołam ./prog plik.txt  wyświetli :  p
      // gdy ./prog < plik.txt mam core dumped    , ????

Dlaczego tak się dzieje ? Chciałbym sprawdzić czy po nazwie programu stoi znak < , który wiadomo co oznacz i potem ustawić jakąś flagę w programie i dalej realizowac funkcje... Jest z tym problem...
Jak się zabrać za cos takiego ?

0

< oraz > są obsługiwane automatycznie przez system operacyjny, nie masz na to wpływu.

gdy wywołam ./prog plik.txt wyświetli : p

Ponieważ argv[1][0] oznacza pierwszy znak z parametru pierwszego

gdy ./prog < plik.txt mam core dumped , ????

Ponieważ < zostanie obsłużone przez system, tak więc argv[1] nie istnieje.

0

Ok, to ja mogę to zrealizować , aby program działał zgodnie z zaleceniami podanymi w 1-szym poście ? Może ktoś mógłby mi coś podpowiedzieć.
Bo muszę po prostu w programi w przypadku gdy argv[1] będzie nazwą pliku zadeklarować strumień fstream na plik. Jak ustawić taki warunek do sprawdzenia czy program wywołano z argumentem czy bez ?

0

Zastanów się nad pierwszym argumentem funkcji main i pomyśl, czemu może on służyć.

1
int main(int argc, char* argv[])
  {
   if(argc>1)
     {
      ifstream fin(argv[1]);
      if(fin) cin.rdbuf(fin.rdbuf());
     }
   char ch;
   while(cin.get(ch)) cout<<ch;
   return 0;
  }

Komentarz dla kiepsko kojarzących:
Powyższy program przy każdym z wywołań:
./prog plik.txt
./prog <plik.txt
zrobi to samo, wyświetli plik plik.txt na ekran.

0

Ok, to wtedy wyszło mi argc równe 1. Ale tutajj zwykła instrukcja warunkowa nie pomoże, bo co wtedy, gdy bede chciał wywołac to tak :
./prog (enter) i potem podawac dane z klawiatury ? Taka opcja tez musi być wzięta pod uwagę

0

No to jeżeli argc == 1 (czyli nie podano żadnych argumentów), to po prostu wczytaj dane z klawiatury?

0

Postanowiłem napisać odpowiedź.

{
  ifstream fin
   if(argc>1)
     {
      ifstream fin.open(argv[1]);
      if(fin) cin.rdbuf(fin.rdbuf());
     }
   char ch;
   while(cin.get(ch)) cout<<ch; 

Ten kod działa, faktycznie wypisuje znak po znaku. Jednak problem jest dość bardziej skomplikowany
W pliku są różne dane, które mają być wczytywane przez przeciążenia. np w klasie Wektor jest tablica Typ wektor[10]; W programie korzystam z najprostszego przypadku dla double, czy jest to tablica z typów wbudowanych. Niestety wyświetlają się smieci

std::istream & operator >> (std::istream & StrmWe,  Wektor<Typ> & Wek){ .. }

Nie widzę sensu wstawiać kodu całego, bo dla wywołania ./prog < plik.txt , działa.
Pytanie brzmi czy ten strumień przekierowany na plik jest znany w innych plikach .hh ?? Bo tam są owe deinicje funkcji przeciążeń.

EDIT :

Już wiem, teraz nie działa funkcja ungetc(ch,stdin);
Ona nie oddaje na wejscie zmiennej gdy wywoluje ./prog plik.txt
Wiem to na pewno bo

 cout<<eo;	  // gdy wczyta EOF wartość operacji wyniesie zero 
ungetc(eo,stdin);
cout<<"tu";

cin>>eo;
cout<<eo;

Ten kod powienien wysiwetlic 2 razy ta samo zmienna , a wyswietla 2 kolejne wiec mamy pewnosc. Pytanie jak to naprawic ?

0
   ifstream fin;
   if(argc>1)
     {
      fin.open(argv[1]);
      if(fin) cin.rdbuf(fin.rdbuf());
     }
   char ch;
   while(cin.get(ch)) cout<<ch;

Dopóki do strumieni przekazywany ten sam cin będzie ok.

Ale jak zaczynasz mieszać z stdin to nie zadziała, zapoznaj się z http://www.cplusplus.com/reference/istream/istream/unget/

0

Troche się pogubiłem , ten poniższy program powinien wczytać wszystkie znaki z plik.dat i je wyświetlic.
Dlaczego tak się nie dzieje ? Dostaję na wyjscie potwierdzenie , ze otwarto plik.

 #include <iostream>
#include<fstream>
using namespace std; 

int main(){

 ifstream fin;
 fin.open("plik.dat");
      
 if(fin)
   cout<<"otwarto";
    
   char ch;
   while(cin.get(ch)) cout<<ch;
}

}
0

Mam do napisania program, który można jednocześnie wywołać z argumentami wywołania, jak i przekierowaniem strumienia wyjściowego z pliku na wejście programu tj. :

./prog < plik.txt
albo
./prog plik.txt

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
   istream *in = NULL;
   ifstream plik;
      
   if (argc==2)
   {
      plik.open(argv[1]);
      if (plik)
         in = &plik;
   }
   else
     in = &cin;

   if (!in)
   {
     cout << "błąd" << endl;
     return -1;
   }

   // teraz używamy strumienia `*in`

   string s;
   *in >> s;
   cout << s << endl;

   if (plik) plik.close();
}
h:\pp>a < a.cpp
#include

h:\pp>a a.cpp
#include

h:\pp>a sbghsdfoubsd
błąd

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