2011-01-11 9 views
6

Co muszę zrobić, aby mój program użył pliku, który został przeciągnięty i upuszczony na jego ikonę jako parametr?Jak włączyć przeciąganie pliku na * .exe i otrzymać go jako parametr?

Moja obecna metoda main wygląda następująco:

int main(int argc, char* argv[]) 
{ 
    if (argc != 2) { 
     cout << "ERROR: Wrong amount of arguments!" << endl; 
     cout << "\n" << "Programm closed...\n\n" << endl; 
     exit(1); 
     return 0; 
    } 

    Converter a(argv[1]); 
    // ... 

    cout << "\n" << "Programm finished...\n\n" << endl; 

    // cin.ignore(); 
    return 0; 
} 

Co naprawdę chciałbym być w stanie zrobić, to wybrać 10 (lub więcej) pliki, upuść je na EXE oraz przetwarzać je od wewnątrz moja aplikacja.


Edycja:

Parametr przychodzących jest stosowany jako pliku, wykonany w cunstructor.

Converter::Converter(char* file) { 
     // string filename is a global variable 
    filename = file; 
    myfile.open(filename.c_str(), ios_base::in); 
} 

Sposób gdzie textfile dostaje przeczytać:

string Converter::readTextFile() { 
char c; 
string txt = ""; 

if (myfile.is_open()) { 

    while (!myfile.eof()) { 
     myfile.get(c); 
     txt += c; 
    } 

} else { 
    error("ERROR: can't open file:", filename.c_str()); 
} 
return txt; 
} 

EDIT2: usunięte

Aktualizacja:
mam ponownie do tego punktu.

Rzeczywista Main metoda:

// File path as argument 

int main (int argc, char * argv []) { if (argc < 2) { cout < < „ERROR: Zła ilość argumentów Daj przynajmniej jeden argument ... \ n " < < endl; cout < < "\ n" < < "Program zamknięty ... \ n \ n" < < endl; cin.ignore(); exit (1); return 0; }

vector<string> files; 

for (int g = 1; g < argc; g++) { 
    string s = argv[g]; 
    string filename = ""; 
    int pos = s.find_last_of("\\", s.size()); 

    if (pos != -1) { 
     filename = s.substr(pos + 1); 

     cout << "argv[1] " << argv[1] << endl; 
     cout << "\n filename: " << filename << "\n pos: " << pos << endl; 
     files.push_back(filename); 

     } 
    files.push_back(s); 
    } 

for (unsigned int k = 0; k < files.size(); k++) 
    { 
    cout << "files.at(" << k << "): " << files.at(k).c_str() << endl; 
    Converter a(files.at(k).c_str()); 
    a.getATCommandsFromCSV(); 
    } 


cout << "\n" << "Programm finished...\n\n" << endl; 

cin.ignore(); 

return 0; 
} 

Faktycznie okno konsoli apears dla może 0,5 s, a następnie zamykają się.
To nie zatrzyma się na żadnym z moich cin.ignore(); Może się tam nie dostanie?

Czy ktoś może pomóc?

+0

@Joey Czy mnie jeszcze pomóc? – Beasly

+0

Zobacz moją odpowiedź poniżej i nie krępuj się zadawać żadnych pytań związanych z ... –

Odpowiedz

14

Twój program nie musi robić nic specjalnego poza obsługą argumentów wiersza poleceń. Po przeciągnięciu pliku do aplikacji w Eksploratorze nie robi nic więcej niż przekazanie nazwy pliku jako argumentu do programu. Podobnie dla wielu plików.

Jeśli wszystko, czego można się spodziewać, to lista nazw plików, a następnie po prostu powtarzaj wszystkie argumenty, rób, co chcesz, i gotowe. To zadziała od zera do prawie dowolnie wielu argumentów.

+0

Próbowałem z jednym plikiem i nie zrobił nic ... Program (okno konsoli) pojawił się przez <1sec. i nic się nie stało. W przeciwieństwie do tego ręczne ustawienie parametru za pomocą konsoli działa dobrze. To dlatego pytam ... – Beasly

+0

@Beasly: ​​Zdajesz sobie sprawę, że okno konsoli zniknie, gdy tylko twój program się uruchomi? Umieść tam przerwę lub poczekaj na naciśnięcie klawisza, aby zobaczyć wyjście. – Joey

+0

Tak, robię;) Chodzi o to, że manipuluję plikiem tekstowym i zapisuję go pod innym nazwiskiem. Przykład: input: test.txt output: text_c.txt - w rzeczywistości ten plik nie jest tworzony. Jak powiedziałem ręcznie, działa ... – Beasly

2

Może mógłbyś napisać program testowy tak:

int main(int argc, char* argv[]) 
{ 
    // argv[0] is not interesting, since it's just your program's path. 
    for (int i = 1; i < argc, ++i) 
     cout << "argv[" << i << "] is " << argv[i] << endl; 

    return 0; 
} 

i zobaczyć, co się dzieje, gdy rzucisz na niego różne pliki.


EDIT: Wystarczy spojrzeć na odpowiedź Joey'a.

+0

+1 mimo to. Z komentarzy na temat mojej odpowiedzi jesteśmy dokładnie w tym momencie: pisanie programu testowego, który wyprowadza argumenty ;-) – Joey

1

Odpowiedź na główne pytanie

Aby zobaczyć odpowiedź na ostatnio PROBLEMU SEE dole tej odpowiedzi

All drag & spadła pliki są get-stanie jak argv[orderOfTheFile] (orderOfTheFile wynosi od 1-n),
jednak jaki sposób okna tworzenia tej kolejności, teraz że jest prawdziwa tajemnica ...

Zresztą powiedzmy chciałbym stworzyć 26 plików tekstowych (* .txt), z a.txt do z.txt na moim pulpicie,
teraz gdybym przeciągnij & spadła je na moim ArgsPrinter_c++.exe znajduje się bezpośrednio na C:\ twardym,
wyjście byłby podobny do tego:

argc = 27 
argv[0] = C:\ArgsPrinter_c++.exe 
argv[1] = C:\Users\MyUserName\Desktop\c.txt 
argv[2] = C:\Users\MyUserName\Desktop\d.txt 
argv[3] = C:\Users\MyUserName\Desktop\e.txt 
argv[4] = C:\Users\MyUserName\Desktop\f.txt 
argv[5] = C:\Users\MyUserName\Desktop\g.txt 
argv[6] = C:\Users\MyUserName\Desktop\h.txt 
argv[7] = C:\Users\MyUserName\Desktop\i.txt 
argv[8] = C:\Users\MyUserName\Desktop\j.txt 
argv[9] = C:\Users\MyUserName\Desktop\k.txt 
argv[10] = C:\Users\MyUserName\Desktop\l.txt 
argv[11] = C:\Users\MyUserName\Desktop\m.txt 
argv[12] = C:\Users\MyUserName\Desktop\n.txt 
argv[13] = C:\Users\MyUserName\Desktop\o.txt 
argv[14] = C:\Users\MyUserName\Desktop\p.txt 
argv[15] = C:\Users\MyUserName\Desktop\q.txt 
argv[16] = C:\Users\MyUserName\Desktop\r.txt 
argv[17] = C:\Users\MyUserName\Desktop\s.txt 
argv[18] = C:\Users\MyUserName\Desktop\t.txt 
argv[19] = C:\Users\MyUserName\Desktop\u.txt 
argv[20] = C:\Users\MyUserName\Desktop\v.txt 
argv[21] = C:\Users\MyUserName\Desktop\w.txt 
argv[22] = C:\Users\MyUserName\Desktop\x.txt 
argv[23] = C:\Users\MyUserName\Desktop\y.txt 
argv[24] = C:\Users\MyUserName\Desktop\z.txt 
argv[25] = C:\Users\MyUserName\Desktop\a.txt 
argv[26] = C:\Users\MyUserName\Desktop\b.txt 

Mój kod ArgsPrinter_c++.exe źródło:

#include <iostream> 
using namespace std; 

int main(int argc, char* argv[]) { 
    cout << "argc = " << argc << endl; 
    for(int i = 0; i < argc; i++) 
     cout << "argv[" << i << "] = " << argv[i] << endl; 

    std::cin.ignore(); 
    return 0; 
} 

Twój ostatni problem

Stworzyłem prosty program, który tworzy tylko sceleton swojej klasie dzięki czemu może być używany, a program Głównego sama prowadził dobrze => jeśli program wychodzi zbyt szybko problem będzie w swojej klasie ...

Testowany kod źródłowy:

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

class Converter{ 
    public: 
    Converter(const char* f){ cout << f << endl; } 
    void getATCommandsFromCSV(){ cout << "called getATCommandsFromCSV" << endl; } 
}; 

int main(int argc, char* argv[]) { 
    vector<string> files; 

    for (int g = 1; g < argc; g++) { 
     string s = argv[g]; 
     string filename = ""; 
     int pos = s.find_last_of("\\", s.size()); 

     if (pos != -1) { 
      filename = s.substr(pos + 1); 

      cout << "argv[1] " << argv[1] << endl; 
      cout << "\n filename: " << filename << "\n pos: " << pos << endl; 
      files.push_back(filename); 

      } 
     files.push_back(s); 
     } 

    for (unsigned int k = 0; k < files.size(); k++) 
     { 
     cout << "files.at(" << k << "): " << files.at(k).c_str() << endl; 
     Converter a(files.at(k).c_str()); 
     a.getATCommandsFromCSV(); 
     } 

    cout << "\n" << "Programm finished...\n\n" << endl; 

    cin.ignore(); 

    return 0; 
} 
Powiązane problemy