-1

我知道如何遍历 argv 参数,但我想做的是获取文件路径并在我的 ifstream 中使用该参数并确保它是正确的格式(.DAT),但是对于我的 ofstream,使用完全相同的路径但是使用 .txt 扩展名代替。

4

2 回答 2

0

我会将所需的“基本”名称作为参数传递。然后,当您尝试将其打开为 . 时,请自行ifstream添加.DAT扩展名并检查该文件是否存在。如果是这样,只需附加.txt您的 ofstream 并写入该文件。

例如,您会调用: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

注意:此代码未经测试,至少不可靠。它假定您传递的每个文件都具有三个字母的扩展名。

于 2013-02-28T16:01:21.693 回答
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
}
于 2013-02-28T16:25:41.750 回答