0

名前が文字列定数であるファイルを作成しようとしていますが、定数文字列「List」、整数++拡張子で構成される文字列です。これが私のコードです:

#include <iostream>
#include <vector>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;

int main (){
            int cont=0;

            std::string result;
            std::string name = "Lista";
            std::string ext = ".txt";

            char numstr[21]; // enough to hold all numbers up to 64-bits
            sprintf(numstr, "%d", cont);
            result = name + numstr+ext;

            freopen (result, "w", stdout);
            cout<<result<<endl;
return 0;
}

ビルドしようとすると、次のエラーが表示されます。

エラー:std::string' to引数1' toFILE*のconstchar*'を変換できませんfreopen(const char *、const char *、FILE *)' |

どうすればこれを解決できますか?

4

3 に答える 3

3

コンパイラエラーが示すように、から std::stringへの暗黙の変換はありませんchar const*(つまり、このコンテキストではc-style-string )。

ただし、 nullで終了する文字列を生成し、レガシーC関数を処理するときに非常に便利なポインタを返すという名前std::stringメンバー関数があります。c_str


例と注意

freopen (result.c_str (), "w", stdout);

char const * p = result.c_str ();

ホスティングオブジェクト(この場合)に変更を加えると、が指すc-style-stringが無効になることに注意てください。したがって、通常、返された値を非一時変数に格納することは賢明ではありません。std::string::c_strresult


以下のリンクをたどると、関数の詳細を読むことができます

于 2012-07-13T03:28:30.040 に答える
2

私はこれを正確に行う小さなアプリを持っています。これを行うにはいくつかの方法があります。最も簡単な方法は

const char * newvar = stringname.c_str();
于 2012-07-13T03:29:50.157 に答える
2

を使用する場合は、使用sprintfをスキップするのがおそらく最も簡単std::stringです。

char name[32];

sprintf(name, "lista%d.txt", cont);
freopen(name, "w", stdout);

使用する場合std::string(とにかくほとんどのC ++でおそらく望ましい)、std::stringstream名前を作成するために使用することをお勧めします。

std::ostringstream name;

name << "lista" << cont << ".txt";

freopen(name.str().c_str(), "w", stdout);

ただし、私はfreopen一般的に避け、C ++でCスタイルのストリーム(スタウトなど)を使用することを避ける傾向があります。一般的には、に書き込む方がよいでしょうostream前の質問への回答は、cout本当に必要な場合に、別の出力ファイルに接続する方法を示しています。

于 2012-07-13T03:55:13.187 に答える