13

これが取引です。大学でC++クラスを紹介していますが、ファイルの拡張子を変更する方法がわかりません。まず、.txtファイルを読み込んで、単語、文、母音などを数えます。これはわかりましたが、次のステップは私を悩ませています。次に、入力ファイルと同じファイル名を使用し、拡張子が.txtではなく.codeの新しいファイルを作成するとします(この新しいファイルでは、それぞれのASCIIコードにランダムな番号を追加して文字列をエンコードします。興味があればキャラクター)。プログラミングの初心者なので、これを行う方法がよくわかりません。最初に入力ファイルを取得するために、次のコードを使用しています。

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

次のようなものを使用して、新しいファイルを作成することを想定しています。

outfile.open("test.code");

しかし、ユーザーがファイル名を入力するまでファイル名がわからないため、「test.txt」とは言えません。したがって、新しいファイルを作成するときにその拡張機能を変更する方法を誰かが知っている場合は、それを非常に高く評価します。

4

13 に答える 13

23

私は時々この質問をしてこのページにたどり着くので、今後の参考のために、ここに1行の構文があります。

string newfilename=filename.substr(0,filename.find_last_of('.'))+".code";
于 2015-01-06T10:05:22.647 に答える
9

これにはいくつかのアプローチがあります。

非常に怠惰なアプローチを取り、.txt拡張子ではなく、ファイル名だけを入力させることができます。この場合、.txtを追加して入力ファイルを開くことができます。

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

次に、電話するだけです

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

次のアプローチは、拡張子を含むファイル名全体を取得し、それに.codeを追加するだけで、test.txt.codeが作成されます。

これが許容できるかどうかは少しあいまいです。

最後に、std::stringメソッドfindを使用replaceして、拡張子のないファイル名を取得し、それを使用できます。

于 2009-04-16T20:44:46.297 に答える
9

もちろん、これが宿題ではなく実際のプロジェクトである場合は、自分で作成するのではなく、Boost.Filesystemを使用して、自分自身(およびコードを読んでいる他の人)に有利に働きますreplace_extension()。少なくともいくつかのコーナーケースでは、バグを思い付くことができないほど単純な機能はありません。

于 2009-04-16T20:50:46.687 に答える
4

学習が演習の要点であるため、それを手放さないでください。ただし、ここにヒントがあります。との組み合わせが必要になる可能性がfind_last_ofありreplaceます。

于 2009-04-16T20:42:55.693 に答える
3

ここにいくつかのヒントがあります。あなたはすでにファイル名を入力しています-あなたがしたいのは、拡張子を含まないファイル名の部分を取得することです:

std::string basename(const std::string &filename)
{
  // fill this bit in
}

その関数を記述したら、それを使用して新しいファイルの名前を作成できます。

std::string codeFile = basename(filename) + ".code";
outFile.open(codeFile);
于 2009-04-16T20:41:42.730 に答える
0

擬似コードは次のようなことをすることになるでしょう

outFilename = filename;
<change outFilename>
outfile.open(outFilename);

outFilenameを変更するには、開始点としてstrrchrとstrcpyを見てください(より適切な方法かもしれませんが、char *でうまく機能します)

于 2009-04-16T20:42:39.047 に答える
0

文字列メソッドを使用しないのはなぜ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");
于 2009-04-16T20:53:01.050 に答える
0

Windowsでは(少なくとも)_splitpathを使用して、残りの部分からベース名を分析し、お気に入りの文字列フォーマッターを使用してそれらを再アセンブルできます。

于 2009-04-17T02:44:08.070 に答える
0

strstrを使用するのはどうですか?

char* lastSlash;
char* newExtension = ".code";
ChangeFileExtension(char* filename) {
    lastSlash = strstr(filename, ".");
    strcpy(lastSlash, newExtension);
}
于 2012-05-11T07:51:56.953 に答える
0

ユーザーが入力したファイル名に「.code」を追加するだけです。「test.txt」と入力した場合、出力ファイルは「test.txt.code」になります。「test」のように拡張子のないファイル名を入力した場合、出力ファイルは「test.code」になります。

私は、出力ファイルとある種の関連するロギング/診断出力を生成するプログラムで、この手法を常に使用しています。実装は簡単で、私の意見では、ファイル間の関係がはるかに明確になります。

于 2012-05-11T10:33:45.713 に答える
-1

あなたがする必要があるのは、拡張子を変更できる新しい変数に元のファイル名をコピーすることです。このようなもの:

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.
}

後で使用するために元のファイル名を保持する必要がない場合は、「filename」変数を使用できる可能性があります。その場合、次を使用できます。

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」など)に誤ってヒットすることはありません。find、rfindなどからのオフセットを操作するときは、それらをカウントとして他のメソッドに渡すときにも注意して使用する必要があります(たとえば、assign(filename、0、extPos-1)を使用しますか? (filename、0、extPos)、assign(filename、0、extPos + 1))。

お役に立てば幸いです。

于 2009-04-16T20:50:40.337 に答える
-1
size_t pos = filename.rfind('.');
if(pos != string::npos)
    filename.replace(pos, filename.length() - pos, ".code");
else
    filename.append(".code");
于 2016-06-14T11:59:26.083 に答える
-1

非常に簡単:

string str = "file.ext";

str[str.size()-3]='a';
str[str.size()-2]='b';
str[str.size()-1]='c';

cout<<str;

結果:「file.abc」

于 2018-05-19T21:17:53.140 に答える