2011-01-11 9 views
6

मेरे प्रोग्राम को ऐसी फ़ाइल का उपयोग करने के लिए मुझे क्या करना है जिसे ड्रैग किया गया है और पैरामीटर के रूप में अपने आइकन पर गिरा दिया गया है?* .exe पर फ़ाइल खींचने और इसे पैरामीटर के रूप में प्राप्त करने में सक्षम कैसे करें?

मेरे वर्तमान main विधि इस प्रकार है:

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

क्या मैं सच में ऐसा करने में सक्षम होना चाहते हैं 10 (या तो) फ़ाइलों का चयन है, EXE पर उन्हें छोड़ देते हैं और उनके भीतर से की प्रक्रिया मेरा आवेदन।


संपादित करें:

incomming पैरामीटर, cunstructor में निर्माण फ़ाइल नाम के रूप में प्रयोग किया जाता है।

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

विधि जहां textfile पढ़ा जाता है:

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: नष्ट कर दिया

अद्यतन:
मैं इस मुद्दे पर फिर से मिल गया।

वास्तविक Main विधि:

// File path as argument 

पूर्णांक मुख्य (int argc, char * argv []) { अगर (argc < 2) { अदालत < < "त्रुटि:! तर्कों की गलत राशि दे दो कम से कम एक तर्क ... \ n " < < endl; cout < < "\ n" < < "प्रोग्राम बंद ... \ n \ n" < < endl; cin.ignore(); बाहर निकलें (1); वापसी 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; 
} 

असल कंसोल विंडो शायद 0.5 सेकंड के लिए apears और फिर से बंद कर देता है।
यह मेरे किसी भी cin.ignore(); पर रोक नहीं सकता है शायद यह वहां नहीं मिलता है?

क्या कोई मदद कर सकता है?

+0

@Joey तुम मुझे फिर से मदद कर सकते हैं? – Beasly

+0

नीचे मेरा उत्तर देखें और संबंधित किसी भी प्रश्न पूछने के लिए स्वतंत्र महसूस करें ... –

उत्तर

14

आपके प्रोग्राम को कमांड लाइन तर्कों को संभालने के अलावा कुछ भी विशेष करने की आवश्यकता नहीं है। जब आप एक्सप्लोरर में किसी एप्लिकेशन पर फ़ाइल खींचते हैं तो यह फ़ाइल नाम को प्रोग्राम के तर्क के रूप में पास करने के अलावा कुछ भी नहीं करता है। इसी प्रकार कई फाइलों के लिए।

यदि आप सभी उम्मीद करते हैं कि फ़ाइल नामों की एक सूची है, तो बस सभी तर्कों पर पुन: प्रयास करें, जो कुछ भी आप चाहते हैं और करें। यह लगभग मनमाने ढंग से कई तर्कों के लिए शून्य के लिए काम करेगा।

+0

मैंने केवल एक फ़ाइल के साथ प्रयास किया और यह कुछ नहीं किया ... प्रोग्राम (कंसोल विंडो) <1sec के लिए दिखाई दिया। और कुछ भी नहीं हुआ। कंसोल के माध्यम से मैन्युअल रूप से पैरामीटर देने के विपरीत ठीक काम करता है। Thats क्यों मैं पूछ रहा हूँ ... – Beasly

+0

@Beasly: ​​आपको एहसास है कि जैसे ही आपका प्रोग्राम चल रहा है कंसोल विंडो गायब हो जाती है? वहां एक विराम दें या एक कीप्रेस की प्रतीक्षा करें ताकि आप आउटपुट देख सकें। – Joey

+0

हां मैं करता हूं;) बात यह है कि, मैं एक टेक्स्ट फ़ाइल में हेरफेर करता हूं और इसे किसी अन्य नाम से सहेजता हूं। उदाहरण: इनपुट: test.txt आउटपुट: text_c.txt - वास्तव में यह फ़ाइल नहीं बनाई गई है। जैसा कि मैंने मैन्युअल रूप से कहा है यह काम करता है ... – Beasly

2

हो सकता है कि आप इस प्रकार का परीक्षण कार्यक्रम लिख सकते हैं:

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

और देखने के बाद आप इसे अलग फ़ाइलों फेंक क्या होता है।


संपादित करें: बस जॉय के जवाब को देखो।

+0

+1 हैं, वैसे भी मेरी प्रक्रिया पोस्ट करेंगे। मेरे उत्तर पर टिप्पणियों से हम अभी उस बिंदु पर बिल्कुल सही हैं: एक परीक्षण प्रोग्राम लिखना जो तर्कों को आउटपुट करता है ;-) – Joey

1

मुख्य प्रश्न

का उत्तर आपके पिछले समस्या का जवाब देखने के लिए इस जवाब का नीचे देखें

सभी खींचें & गिरा फ़ाइलें हैं पाने के योग्य के रूप में argv[orderOfTheFile] (orderOfTheFile से 1-एन है),
तथापि कैसे विंडो बनाने करता है कि आदेश, अब कि एक असली रहस्य है ...

वैसे भी मेरा डेस्कटॉप पर कहते हैं कि मैं 26 सादा पाठ फ़ाइलों को बनाने के लिए (* .txt), a.txt से z.txt को,
अब अगर मैं खींचें & मेरी ArgsPrinter_c++.exeC:\ ड्राइव पर स्थित पर उन्हें गिरा दिया जाएगा करते हैं,

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 

मेरे ArgsPrinter_c++.exe स्रोत कोड:

#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; 
} 
एक आउटपुट इस के समान होगा

आपकी आखिरी समस्या

मैं एक साधारण प्रोग्राम है जो आपके वर्ग का केवल एक sceleton बनाता है तो यह किया जा सकता है बनाया है, और कार्यक्रम के मुख्य ही ठीक => भाग गया है, तो अपने कार्यक्रम बहुत जल्दी बाहर निकलता है , समस्या अपनी कक्षा में हो जाएगा ...

परीक्षण स्रोत कोड:

#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; 
} 
संबंधित मुद्दे