2013-02-28 15 views
-1

我知道如何遍歷argv參數,但我想要做的是採用文件路徑並在我的ifstream中使用該參數,並確保它是正確的格式(.DAT),但對於我的ofstream,使用完全相同的路徑但帶有.txt擴展名。如何從argv獲取文件名並將其與ifstream一起使用/將其更改爲txt forstream?

+1

所以製作一個字符串的副本並將「.txt」追加到最後?你遇到什麼麻煩?請顯示你的代碼。 – Celada 2013-02-28 16:01:21

+0

參數是完整的文件路徑 – MyNameIsKhan 2013-02-28 16:03:47

回答

0

我會通過所需的「基本」名稱作爲參數。然後,當您嘗試將其作爲ifstream打開時,請自行添加.DAT擴展名並檢查文件是否存在。如果是這樣,只需追加.txt即可,並寫入該文件。

例如,你會打電話:myapp.exe inout

然後,你會檢查輸入文件名:

std::ifstream ifs(std::string(argv[1]) + ".dat"); // reads from inout.dat 
if (ifs.fail()) ... 

std::ofstream ofs(std::string(argv[1]) + ".txt"); // writes to inout.txt 
if (ofs.fail()) ... 

編輯:您已經添加了重要的細節,你拖着.dat文件到你的可執行文件在這種情況下,您必須自己移除擴展名。像這樣的東西應該工作(但不容錯!):

std::string basename = argv[1]; // take the whole path, including dat extension (DAT EXTENSION!) 
basename.resize(basename.length() - 3); // remove dat extension (hah!) 
std::string outname = basename + "txt"; // add the output extension 

注:此代碼是未經測試,不穩健,在最。它假設你通過它的每個文件都有一個三個字母的擴展名。

+0

現在,我只是將.DAT文件拖到我的可執行文件上。生成的argv是一個文件路徑的列表,其中包含路徑 – MyNameIsKhan 2013-02-28 16:03:24

+0

中的.DAT,然後從該字符串的末尾刪除「.dat」,並替換爲「.txt」 – 2013-02-28 16:08:24

0

我會通過調用rfind來查找參數中最後一次出現「.DAT」的位置,然後獲得一個子字符串到結果位置,您可以在其中添加.txt,如下所示:

string fullPath = string(argv[1]); 
size_t pos = fullPath.rfind(".DAT"); 
if (pos == string::npos) 
{ 
//fail 
}else{ 
string outfilePath = (fullPath.substr(0,pos)).append(".txt"); 
//write to file 
} 
相關問題