Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Code block, uruchamianie programu z cmd z wykorzystaniem redirection

Ostatnio zmodyfikowano 2014-12-22 12:17
Autor Wiadomość
kizia
Temat założony przez niniejszego użytkownika
[C] Code block, uruchamianie programu z cmd z wykorzystaniem redirection
» 2014-12-14 23:07:37
Witam wszystkich serdecznie,
Panowie i Panie, czas ucieka zabierzmy się do pracy!

Piszę program który muszę uruchamiać z cmd z jednym argumentem oraz tekstem z pliku
program.exe 2 text.txt
I program polega na tym, ze aby uruchomić ten program muszę go skompilować, zamknąć, otworzyć cmd i tam wpisać powyższą komendę. Nie jest to zbyt wygodne, a co gorsza nie mogę używać debuggera. Piszę w Code block i próbowałem ustawić : Project->Set programs arguments
2 < text.txt
Lecz wtedy nie dostaje tekstu na stdin, tylko jako kolejny argument, co jest bardzo smutne :(. Czy jest jakaś możliwość uruchomienia tego z IDE wstawiając do stdin na samym początku mój tekst?
Próbowałem nawet wyczarować coś
stdin < "asdas";
na samym początku programu, no ale chyba przesadziłem z tą magią.
Dane pobieram za wykorzystaniem funkcji getchar() :
for(...( c = getchar() ) != EOF...)

I taki jeszcze pytaniowy bonus. Jeżeli chciałym zrobić apkę która właśnie działaąłby z cmd czyli właśnie w ten sposób
program.exe 2 text.txt
 ale również żeby działała jeżeli odpalę bezpośrednio .exe To jak to zrobić żeby użytkownik mógł wpisać swój tekst i program poszedł dalej, ponieważ tak to funkcja getchar() zatrzymuje mnie na zawsze jako iż user wpisuje do buffora, wciska enter, dociera to do stdin, getchar() sobie pobiera ładnie fajnie, ale pobierze wszystko i na końcu nie zobaczy EOF, a więc będzie czekał dalej na dane. Nie mogę dopisać znaku przejdzie do następnej lini, którym user wpisuje tekst
&& c != '\n'
 Czy coś tego typu, bo czasami może pojawić się to w pliku txt a nie chciałbym przerwać pobierania danych po napotkaniu \n.
Dziękuję bardzo za przeczytanie mojej pięknej opowieści, wiem że to takie zagmatwane, także zadawajcie pytania, ja wyjaśnię z chęcią problem, a teraz życzę dobrej nocy, imprezujcie kochani informatycy i fanatycy <3
P-122879
darko202
» 2014-12-15 08:19:27
nie wiem czy do końca Cię zrozumiałem, ale

1.
funkcja system wykonuje podane w parametrze polecenia, tak, jakbyś je wykonał wpisując je samemu z Command Line.

system("nazwa.rozszerzenie parmametr1 ...");

np.: system("calc.exe") ; //<----  kalkulator
system("jakiś.exe a b c"); //<---- wykonanie exe z argumentami.

2.
może też być
C/C++
bool runProcess( System::String ^ proc, System::String ^ args )
{
    if( File::Exists( proc ) ) // sprawdzenie, czy plik istnieje
    {
        process = Process::Start( proc, args ); // wywolanie zadanego procesu
        return true;
    }
    return false;
}
przykład z
http://webhosting.pl​/Proste.uruchamianie.i.zamykani​e.zewnetrznych.programow.w.Vis​ual.C__​/C%23.NET

i inne
3.
WinExec("notepad.exe",SW_SHOWNORMAL);
http://kurs-c-plus-plus.cba.pl​/?page_id=342

4.
ShellExecuteA(0, 0 ,"notepad.exe",0,0,SW_SHOW);

5.


P-122886
kizia
Temat założony przez niniejszego użytkownika
» 2014-12-15 10:50:32
Tylko że nie mam na myśli, otwieranie kolejnej aplikacji, tylko chcę, aby po uruchomieniu z IDE w stdin znalazł się tekst z pliku, co wiem jak zrobić w cmd ale nie wiem jak zautomatyzować ten proces bez używania cmd
P-122887
darko202
» 2014-12-15 11:05:22
P-122888
kizia
Temat założony przez niniejszego użytkownika
» 2014-12-15 12:17:41
Bóg zapłać Drogi Człowieku.
Funcja freopen(); powinna pomóc przy pracy. Na początku kodu wstawiam
freopen( "bin\\debug\\dupa.txt", "r", stdin );
dzięki czemu mam tekst z pliku na stdin, a jak będę miał ukończonyy program to to usunę i będzie działać z cmd tak jak wymaga tego projekt.

Jeszcze zostaje druga kwestia. Jeżeli użytkownik np wpisze w cmd

program.exe 2 < dupa.txt
To wszystko będzie śmigać i program zwróci potrzebny wynik.
Natomiast użytkownik powinien mieć również możliwość uruchomienia programu w taki sposób

program.exe 2
I w tym momencie wprowadzać dane nie z pliku tylko z keyboarda, tylko że używam  warunku:

for( i= 0 ; ( c = getchar() ) != EOF ; i++ )
    {..}
Czyli getchar() czeka na EOF, którego z keyboarda nie dostanę. Czyli chciałbym aby po wciśnięciu enter przez użytkownika wszystkie characters zostały pobrane przez getchar i pętla została opuszczona. Ale nie mogę dać warunku dodatkowego

c != '\n'
Ponieważ wtedy jeżeli wystąpi znak nowej lini w pliku, to nie wczyta całego pliku.
Jakieś pomysły jak to najprościej rozwiązać?
Albo jak sprawdzić czy user użył redirection?
Gdybym wiedział czy wstawił w cmd

< dupa.txt
czy nie, mógłbym zastosować odpowiednie warunki.
Istnieje możliwość sprawdzenia tego?
P-122889
darko202
» 2014-12-15 13:09:46
Nie jestem pewny czy Cię zrozumiałem, ale 
można trochę zmienić warunek i zamiast getchar użyć getline
C/C++
int rozmiar = 260;
char dane[ rozmiar ],
cin.getline( dane, rozmiar );

zamiast EOF sprawdzać, czy pobrane dane nie są puste
wczytana pusta linia oznacza koniec pobierania danych
zakładamy że może wprowadzić kolejne linie

na
http://www.cs.bu.edu/teaching​/cs111/spring-2000/file-io/
znalazłem
C/C++
while( inFile >> username >> score ) {
    ...
}
wydaje mi się że pętla while działa dopóki pobiera dwie wartości określonego typu
inaczej zwraca 0

One solution is to test against the number of values we expect to be read by >> operator each time. Since there are two types a string and an integer, we expect it to read in 2 values
Now, if we get 2 values, the loop continues. If we don't get 2 values, either because we are at the end of the file or some other problem occurred (e.g., it sees a letter when it is trying to read in a number), then the loop will end (>> will return a 0 in this case).



 

P-122890
kizia
Temat założony przez niniejszego użytkownika
» 2014-12-18 22:10:42
To jest C, także spróbowałem z użyciem getline, ale z tym również nie działa. Ale problem na razie nie istotny, jeżeli znajdę odpowiedź to zamieszczę
P-123085
kizia
Temat założony przez niniejszego użytkownika
» 2014-12-21 22:05:03
yep yep znalazłem jedno rozwiązanie tego problemu można to zrobić posługując się wskaźnikami w pliku :

    int text_length = 0;
    char *data;

    // Checking how many characters is in an input.
    fseek( stdin, 0, SEEK_END );
    fgetpos( stdin, &text_length );
    fseek( stdin, 0, SEEK_SET );

    if( text_length == 0 )
    {
        // przypadek bez pliku
    }
    else
    {
        // przypadek < asd.txt
     }
P-123209
« 1 » 2
  Strona 1 z 2 Następna strona