好吧,事情就是这样,我正在大学学习 C++ 课程,但不知道如何更改文件的扩展名。首先,我们要做的是读取 .txt 文件并计算单词、句子、元音等。好吧,我明白了,但下一步是困扰我的问题。然后,我们假设使用与输入文件相同的文件名创建一个新文件,但扩展名为 .code 而不是 .txt(在该新文件中,我们通过向每个文件的 ASCII 代码添加随机数来对字符串进行编码)如果您有兴趣的话)。作为编程初学者,我不太确定如何做到这一点。我首先使用以下代码来获取输入文件:

cout << "Enter filename: ";
cin >> filename;
infile.open(filename.c_str());

我假设创建一个新文件,我将使用类似以下内容的文件:

outfile.open("test.code");

但在用户输入之前我不知道文件名是什么,所以我不能说“test.txt”。因此,如果有人知道在我创建新文件时如何更改该扩展名,我将非常感激!

有帮助吗?

解决方案

有几种方法可以实现这一点。

您可以采取超级懒惰的方法,让他们只输入文件名,而不输入 .txt 扩展名。在这种情况下,您可以将 .txt 附加到其中以打开输入文件。

infile.open(filename + ".txt");

然后你只需调用

outfile.open(filename + ".code");

下一个方法是获取包括扩展名在内的整个文件名,然后将 .code 附加到其中,这样您就拥有了 test.txt.code。

这是否可以接受有点模棱两可。

最后,您可以使用 std::string 方法 find, , 和 replace 获取不带扩展名的文件名,并使用它。

其他提示

我偶尔会问自己这个问题,并在此页上结束了,所以以供将来参考,这里是单行语法:

string newfilename=filename.substr(0,filename.find_last_of('.'))+".code";
// WWW:使用的当然,如果这不是作业,但一个真实世界的项目,你可能会做自己 - 以及其他人阅读你的代码.boost.org / DOC /库/发行/库/文件系统/ index.html的”相对= “noreferrer”> Boost.Filesystem的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”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top