2009-04-16 15 views
8

申し訳ありませんが、私の大学ではC++クラスの紹介をしていますが、ファイルの拡張子を変更する方法がわかりません。まず、私たちがやっていることは、.txtファイルに読み込まれ、単語、文、母音などが数えられます。これはうまくいきましたが、次のステップは私を悩ますものです。入力ファイルと同じファイル名を使用し、.txtではなく.codeという拡張子を持つ新しいファイルを作成すると仮定します(新しいファイルでは、それぞれのASCIIコードに乱数を追加して文字列をエンコードします)あなたが興味を持っていれば、あなたのキャラクター)。プログラミングの初心者である私は、これをどうやって行うのかについてはあまりよく分かりません。私は私のようなものを使用しているつもりだ新しいファイルを作成すると仮定していC++の文字列に格納されているファイル拡張子をどのように変更しますか?

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

outfile.open("test.code"); 

Iは、入力ファイルを取得する最初のATに次のコードを使用していますしかし、私は "test.txt"と言うことができないようにユーザーがそれを入力するまでファイル名が何であるかわからない。だから誰かが新しいファイルを作成するときにその拡張を変更する方法を知っていれば、私は非常に感謝します!

答えて

8

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

スーパー・レイジー・アプローチを採用して、.txt拡張子ではなくファイル名で入力させることができます。この場合、.txtを追加して入力ファイルを開くことができます。

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

次に、あなただけの次のアプローチは、拡張子を含むファイル名全体を取り、あなたがtest.txt.codeを持っていると思いますので、それに.CODEを追加することであろう

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

を呼び出します。

これが受け入れられるかどうかは少し曖昧です。

最後に、std::stringの方法findreplaceを使用して、拡張子のないファイル名を取得して使用することができます。

+0

申し訳ありませんが、オプションは、私がちょうど最近ストリングメソッドについて学んだように、私が探していたラインに沿っていると思います。入力いただきありがとうございます! –

+2

最後の "。"が見つかるので、rfind()を改善してください。 'a.b.c.txt'が有効なファイル名である場合の最初の文字の代わりに –

+1

.open()はstd :: stingではなくconst char *を取ります。 – MSalters

3

ここにはいくつかのヒントがあります。

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

は、その機能を書かれた、新しいの名前を作成するためにそれを使用することができます:あなたがやりたいことは拡張子が含まれていないファイル名の一部を取得することです - あなたはすでに入力されたファイル名を持っていますファイル:

std::string codeFile = basename(filename) + ".code"; 
outFile.open(codeFile); 
+0

をテストすることを忘れないでください。私は私のファイルに名前を付けるのが好きです。これは – veefu

0

擬似コードは、outFileNameはを変更するための

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

ような何かを(より適切な方法であるかもしれない出発点としてstrrchrとstrcpyのを見てだろう - それはchar *でもうまくいくでしょう)

+0

なぜコードがC++のときにCスタイルのメソッドを提案するのですか? –

4

学習は学習の全ポイントですが、ここではヒントです。 おそらくfind_last_ofreplaceの組み合わせが必要になるでしょう。

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

それはあなたが後で使用するために周りのオリジナルのファイル名を維持する必要がない場合は、「ファイル名」変数を使用することができ可能です。その場合、あなただけ使用できます。

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などのオフセットを使って作業しているときは、他のメソッドにcountとして渡すときには注意してください(例えば、assign(filename、0、extPos-1)、assign (ファイル名、0、extPos)、(ファイル名、0、extPos + 1)を割り当てます。

希望に役立ちます。

+3

宿題に関する質問ですので、すべてを捨てないでください –

8

もちろん、これは宿題ではなく実際のプロジェクトであれば、あなた自身のコードを読む代わりにBoost.Filesystemreplace_extension()を使用して自分自身や他の人がコードを読んでいると思います。少なくともいくつかのコーナーのケースでは、バグを思い付くことができないほど簡単な機能はありません。

0

なぜ文字列メソッドfind_last_of()を使用しないのですか? Windowsので

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"); 
0

(少なくとも)あなたは作品の残りの部分からベース名を分析するために_splitpathを使用してから、お好きな文字列フォーマッタを使用してそれらを再構成することができます。

char* lastSlash; 
char* newExtension = ".code"; 
ChangeFileExtension(char* filename) { 
    lastSlash = strstr(filename, "."); 
    strcpy(lastSlash, newExtension); 
} 
0

。 「test.txt」と入力した場合、出力ファイルは「test.txt.code」になります。 "test"のような拡張子のないファイル名を入力した場合、出力ファイルは "test.code"になります。

出力ファイルを生成するプログラムと関連するログ出力/診断出力など、この手法を常に使用します。私の考えでは、ファイル間の関係をはっきりと明示しています。

0

私は、ユーザーが入力したファイル名に ".CODE" を追加します:はstrstrを使用することについてどのように

5

私は時折、今後の参考のために、ここではシングルライン構文があるので、自分自身にこの質問をして、このページに終わる:

string newfilename=filename.substr(0,filename.find_last_of('.'))+".code"; 
+0

"file.tar.gz"のようなものでは動作しません –

+0

"extension"の定義が "最後のものの後のもの"ならば簡単な経験則を探しているならば、合理的です。 gzipされたアーカイブ、バージョン番号を持つファイル名、Makefileなどの特別な場合は、特別なポリシーを定義し、それを専用の方法で実装する必要があります。 – Narcolessico

0
size_t pos = filename.rfind('.'); 
if(pos != string::npos) 
    filename.replace(pos, filename.length() - pos, ".code"); 
else 
    filename.append(".code"); 
+0

あなたの解答を解説付きで更新してください。 –

+0

このコードは質問に答えるかもしれませんが、_why_および/または_how_に関する追加のコンテキストを に追加すると、 と回答すると、その質問は長期間の 値を大幅に改善します。あなたの答えを[編集]して、説明を加えてください。 –

+0

std :: string :: replaceは、string :: nposを(長さを計算するのではなく)lenとして取ることができます。これは、文字列の最後まで置換されます。 – user79878

関連する問題