如何从argv中获取文件名并将其与ifstream一起使用/将其更改为ofstream的txt

How to take in a filename from argv and use it with ifstream / change it to txt for ofstream?

本文关键字:txt ofstream 一起 argv 获取 文件名 ifstream      更新时间:2023-10-16

我知道如何通过argv参数迭代,但我想做的是采取文件路径,并在我的ifstream中使用该参数,并确保它是正确的格式(. dat),但随后对于我的ofstream,使用完全相同的路径,但扩展名为。txt。

我将传递所需的"base"名称作为参数。然后,当您尝试将其作为ifstream打开时,请自己添加.DAT扩展名并检查该文件是否存在。如果是,只需为ofstream附加.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()) ...

EDIT:您已经添加了将.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

注意:这段代码是未经测试的,一点也不健壮。它假定您传递给它的每个文件都有三个字母的扩展名。

我会通过调用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
}