2011-01-11 9 views
6

Cosa devo fare per far utilizzare al mio programma un file che è stato trascinato e lasciato cadere sulla sua icona come parametro?In che modo abilitare il trascinamento di un file su * .exe e ottenerlo come parametro?

Il mio attuale metodo main si presenta così:

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; 
} 

Quello che mi piacerebbe davvero essere in grado di fare è selezionare 10 (o giù di lì) file, farli cadere sul EXE, ed elaborarli dall'interno la mia applicazione.


EDIT:

Il parametro incomming viene utilizzato come nome file, costruita nel cunstructor.

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

Il metodo in cui il file di testo viene letto:

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: eliminato

Aggiornamento:
ho avuto di nuovo a questo punto.

Actual Main metodo:

// File path as argument 

int main (int argc, char * argv []) { if (argc < 2) { cout < < "ERRORE: importo errato di argomenti Dare almeno un argomento ... \ n " < < endl; cout < < "\ n" < < "Programma chiuso ... \ n \ n" < < endl; cin.ignore(); uscita (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; 
} 

realtà finestra della console apears forse per 0,5 secondi e si richiude.
Non si ferma su nessuno dei miei cin.ignore(); Forse non arriva?

Qualcuno può aiutare?

+0

@Joey mi potete aiutare di nuovo? – Beasly

+0

Vedere la mia risposta qui sotto e sentirsi libero di porre domande correlate ... –

risposta

14

Il tuo programma non deve fare nulla di speciale a parte la gestione degli argomenti della riga di comando. Quando trascini un file su un'applicazione in Explorer, non fa altro che passare il nome del file come argomento al programma. Allo stesso modo per più file.

Se tutto quello che ci si aspetta è un elenco di nomi di file, quindi basta scorrere su tutti gli argomenti, fare quello che vuoi con loro e fare. Questo funzionerà da zero a quasi arbitrariamente molti argomenti.

+0

Ho provato con un solo file e non ha fatto nulla ... Il programma (finestra della console) è apparso per <1sec. e non è successo nulla. Al contrario, dare manualmente il parametro attraverso la console funziona bene. Ecco perché sto chiedendo ... – Beasly

+0

@Beasly: ​​Ti rendi conto che la finestra della console scompare non appena il tuo programma finisce di funzionare? Metti una pausa o aspetta una pressione di un tasto in modo da poter vedere l'output. – Joey

+0

Sì, sì;) Il fatto è che manipolo un file di testo e lo salvo con un altro nome. Esempio: input: test.txt output: text_c.txt - in realtà questo file non è stato creato. Come ho detto manualmente funziona ... – Beasly

2

Forse si potrebbe scrivere un programma di test come questo:

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; 
} 

e vedere cosa succede dopo si passi diversi file a questo.


EDIT: Basta guardare la risposta di Joey.

+0

+1 in ogni caso. Dai commenti sulla mia risposta siamo esattamente a quel punto, ancora una volta: scrivere un programma di test che restituisca gli argomenti ;-) – Joey

1

risposta alla domanda principale

per vedere la risposta alla sua ultima PROBLEMA vedere fondo questa risposta

Tutti trascinare & sceso file sono get-grado come argv[orderOfTheFile] (orderOfTheFile da 1-n),
però come si fa finestre creano questo ordine, ora che è un vero mistero ...

facciamo ogni modo di dire vorrei creare 26 file di testo (* .txt), a.txt-z.txt sul mio desktop,
ora se avrei trascinare & caduto sul mio ArgsPrinter_c++.exe situato direttamente sulla C:\ unità,
un'uscita sarebbe simile a questa:

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 

il mio codice ArgsPrinter_c++.exe fonte:

#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; 
} 

Il vostro ultimo problema

ho creato un semplice programma che crea solo uno sceleton della classe in modo che possa essere utilizzato, e del programma principale stesso correva bene => se il programma esce troppo presto , il problema sarà nella tua classe ...

codice sorgente Provato:

#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; 
} 
Problemi correlati