如何更改 C++ 中存储在字符串中的文件扩展名?
-
09-09-2019 - |
题
好吧,事情就是这样,我正在大学学习 C++ 课程,但不知道如何更改文件的扩展名。首先,我们要做的是读取 .txt 文件并计算单词、句子、元音等。好吧,我明白了,但下一步是困扰我的问题。然后,我们假设使用与输入文件相同的文件名创建一个新文件,但扩展名为 .code 而不是 .txt(在该新文件中,我们通过向每个文件的 ASCII 代码添加随机数来对字符串进行编码)如果您有兴趣的话)。作为编程初学者,我不太确定如何做到这一点。我首先使用以下代码来获取输入文件:
cout << "Enter filename: ";
cin >> filename;
infile.open(filename.c_str());
我假设创建一个新文件,我将使用类似以下内容的文件:
outfile.open("test.code");
但在用户输入之前我不知道文件名是什么,所以我不能说“test.txt”。因此,如果有人知道在我创建新文件时如何更改该扩展名,我将非常感激!
其他提示
我偶尔会问自己这个问题,并在此页上结束了,所以以供将来参考,这里是单行语法:
string newfilename=filename.substr(0,filename.find_last_of('.'))+".code";
replace_extension()
而不是滚动您自己。这里还有没有的功能,是很简单的,你不能拿出一个错误,至少在某些极端情况。 不送人,因为学习是锻炼的整点,但这里有一个提示。
你可能会想 find_last_of
和的 replace
。
下面是一些提示。已经输入一个文件名 - 你想要做的就是让不包括扩展名的文件名的一部分:
std::string basename(const std::string &filename)
{
// fill this bit in
}
已经编写了功能,你可以用它来创建新的文件的名称:
std::string codeFile = basename(filename) + ".code";
outFile.open(codeFile);
伪代码将执行类似的操作
outFilename = filename;
<change outFilename>
outfile.open(outFilename);
有关改变outFilename,看strrchr和strcpy作为出发点(可能是更合适的方法 - 将工作伟大的一个char *虽然)
在视窗(至少)可以使用 _splitpath 以从片的其他解剖的基本名称,然后用你喜欢的字符串格式化重新组合。
为什么不使用字符串方法 find_last_of()
?
std::string new_filename = filename;
size_type result = new_filename.find_last_of('.');
// Does new_filename.erase(std::string::npos) working here in place of this following test?
if (std::string::npos != result)
new_filename.erase(result);
// append extension:
filename.append(".code");
我只追加“.CODE”到用户输入的文件名。如果他们进入“的test.txt”,那么输出文件将是“test.txt.code”。如果他们输入文件名不带扩展名,例如“测试”,然后输出文件将是“test.code”。
我使用这种技术所有的时间与产生的输出文件和某种相关记录/诊断输出的程序。这是实现简单,在我看来,做文件之间的关系更加明确。
如何使用的strstr:
char* lastSlash;
char* newExtension = ".code";
ChangeFileExtension(char* filename) {
lastSlash = strstr(filename, ".");
strcpy(lastSlash, newExtension);
}
什么你需要做的是原始文件名复制到一个新的变量,您可以更改扩展名。是这样的:
string outFilename;
size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{
// Copy everything up to (but not including) the '.'
outFilename.assign(filename, 0, extPos);
// Add the new extension.
outFilename.append(".code");
// outFilename now has the filename with the .code extension.
}
这是可能的,你可以使用“文件名”变量,如果你没有需要保留原始文件名以备后用。在这种情况下,你可以只使用:
size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{
// Erase the current extension.
filename.erase(extPos);
// Add the new extension.
filename.append(".code");
}
的关键是看C ++串类的定义和理解各部件的功能是什么。使用RFIND将通过串向后搜索,你会不小心碰到文件夹名称中的任何扩展,可能是原来的文件名的一部分(如“C:\ MyStuff.School \ MyFile.txt的”)。当与发现,RFIND等的补偿工作,你还需要小心将它们作为时计数到其他的方法(例如,你用指定正确地使用它们(文件名,0,extPos-1),分配(文件名,0,extPos),分配(文件名,0,extPos + 1))。
希望有所帮助。
size_t pos = filename.rfind('.');
if(pos != string::npos)
filename.replace(pos, filename.length() - pos, ".code");
else
filename.append(".code");
非常容易:
string str = "file.ext";
str[str.size()-3]='a';
str[str.size()-2]='b';
str[str.size()-1]='c';
cout<<str;
结果: “file.abc”