2016-03-25 17 views
1

Amacım, bir C++ projesinin yapısı olan bir exe'ye rastgele bir metin dosyası göndermek. C++ projesinde exe'ye gönderilen dosyayı okumak istiyorum. Bu yüzden, gönderilen dosyanın yolunu uygulamaya (exe) iletmem gerektiğini düşünüyorum.windows, C++: exe (C++ çözümü) dosyasına dosya gönder ve gönderilen dosyadaki verileri oku

My C++ kodu [çalışıyor!]:

#include "stdafx.h" 
#include <string.h> 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::string readLineFromInput; 

    ifstream readFile("input.txt"); // This is explizit. 
            // What I need is a dependency of passed path. 
    getline(readFile, readLineFromInput); 

    ofstream newFile; 
    newFile.open("output.txt"); 
    newFile << readLineFromInput << "\n"; 

    newFile.close(); 
    readFile.close(); 
} 

Benim Windows yapılandırmasını:

aşağıdaki yolu ben exe (c inşa ++ projesi) için bir kısayol oluşturdu: C: \ Kullanıcılar {Kullanıcı} \ AppData \ Roaming \ Microsoft \ Windows \ SendTo

Soru: r istiyorum

keyfi bir metin dosyasına tıklayın ve exe'a (SendTo) aktarın. Gönderilen dosyanın yolunu, uygulamanın gönderilen dosyayı okuyabileceği şekilde uygulamaya argüman olarak nasıl iletebilirim? yol kod satırı böyle olmalı bağımsız değişken olarak geçirilir

sanırım:

ifstream readFile(argv[1]); 

Çok teşekkür!

David

+0

SendTo zaten tam olarak bunu yapar. Test ettin mi ve sorun mu yaşadın? – smead

+0

Test etmedim çünkü argv [1] bana çok garip geliyordu. "Remy Lebeau" nun açıkladığı gibi, kaynak dosyaya yorumlanabilir bir yol bulmak için bazı string işlemlerini yapmak zorundayım. Yani, “readstile readFile (argv [1]); 'tam olarak istediğimi yapar. Sıradaki içeriğin anlaşılması ve bazı dizi işlemlerinin yapılması. Teşekkür ederim. –

cevap

1

Eğer SendTo veya OpenWith kullanın, tıklandığında dosya adı bir komut satırı parametresi olarak yürütülebilir geçilecek. argv[] dizisi, SendTo kısayolunuz ek komut satırı parametrelerini belirtmediği sürece dosya adını (argv[1]'da) içerecektir, bu durumda argv[] dizinini buna göre ayarlamanız gerekir).

SendTo ile bir test yaptım ve argv[1] iyi çalışıyor. Dosya adını açmadan önce, argc'u kontrol ettiğinizden emin olunuz, örneğin:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    if (argc > 1) 
    { 
    std::string readLineFromInput; 

    std::ifstream readFile(argv[1]); 
    if (readFile) 
     std::getline(readFile, readLineFromInput); 

    std::ofstream newFile(_T("output.txt")); 
    if (newFile) 
     newFile << readLineFromInput << "\n"; 
    } 
} 
+0

Evet, haklısınız. İşe yarıyor! Output.txt dosyasını input.txt okunduğu aynı dizine nasıl yazabilirim? Benim durumum, çıkış dizini exe'nin bulunduğu yerdir. Argv [1] yazdırmaya çalıştım ancak kaynak dosyaya bir tanımlayıcı ve tam bir yol (c: \ foo \ input.txt) değil gibi görünüyor. –

+1

Tekrar kontrol edin. Argv [] 'değeri, girdi dosyasının * tam * yolunu ve dosya adını içerecektir. Yolu dosya adından ayırmak için değeri ayrıştırmak için kod yazmanız gerekir, daha sonra istenen çıktı dosya adını çıkartılan yola ekleyebilirsiniz. Bu, 101 çeşit malzemeyi işleyen temel dizedir, etrafta arama yapabilmeniz ve size yardımcı olacak çok sayıda öğretici/örnek bulabilmeniz gerekir. Eğer hala bunu çözemiyorsan, yeni bir soru yayınla. Bu soru sorulduğu gibi cevaplandı. –

+1

Veya sadece 'boost :: filesystem :: yol :: parent_path' kullanın. – MSalters