2017-09-29 6 views
-2

ファイル名を引数(例:books.txt)に入れて実行し、その結果を新しいテキストファイルに出力するプログラムがあります。出力ファイルに補遺を付ける必要があります(例:books_output.txt)。変数とテキストを使ってファイルに名前を付けるC++構文

私が試した方法は

ofstream outputFile; 
outputFile.open(argv[1] + "_output.txt", ofstream::out); 

だったが、これはコンパイルされませんでした。 どうすればこの作品を作れますか?

+0

S/'ARGV [1]'/'のstd ::文字列のようになります持っている(ARGV [1])' – user0042

+0

あなたの質問は、私はC言語で文字列を連結んか」です++ "、google for、あなたが打ったものを参照してください。 – pm100

+0

@ user0042 - ofstream.openが文字列ファイル名をサポートしているかどうかに依存しているC++のバージョンに依存します。 – pm100

答えて

1

(私のコメントで述べたように)次のようになりますあなたの声明:

outputFile.open(std::string(argv[1]) + "_output.txt", ofstream::out); 
      // ^^^^^^^^^^^^  ^

とすると、argv[1]main() si gnature

int main(int argc, char* argv[]) 

argv[1]char*ポインタであり、あなたがそのようchar*ポインタを連結することはできません。

古くなったC++標準バージョンのサポートに関して迷惑をかける人もいますが、std::ofstream::open()のシグネチャはconst std::stringのパラメータを直接サポートしていませんが、const char*しかサポートしていません。場合にはあなたがそのような状況は、あなたの文が

outputFile.open((std::string(argv[1]) + "_output.txt").c_str(), ofstream::out); 
-3

2つのC文字列の間に+を挿入することはできません。代わりにstd :: stringを使用してください。この

ofstream outputFile; 
std::string fname = std::string(argv[1]) + "_output.txt"; 
outputFile.open(fname.c_str(), ofstream::out); 

最近のC++バージョンが同じことをよりよい読み取りますが、意味

outputFile.open(fname, ofstream::out); 

を許可しています

+2

確かに 'argv [1] +" _output.txt " '' string''を初期化していて、どちらかの引数をあらかじめ変換しているのを知ることはできません。 ''古いC++( 'std :: string(argv [1])+" _output.txt "')でC++の 'std :: string'リテラル(' argv [1] + ' _output.txt "s'は文字列リテラルに' s'をつけています)。あるいは、2つのステップを実行します: 'std :: string fname = argv [1]; fname + = "_output.txt"; ' – ShadowRanger

+0

私はC++ 11を使用しています。 @ pm100とShadowRangerの両方のソリューションが機能しました。助けてくれてありがとう! –

+0

oops - 私の悪い - 私はstd :: stringでarvをラップするのを忘れてしまった – pm100

関連する問題