-4

以下は、出力ファイルを持つコードです。この出力ファイルに毎回異なる名前を付けたい場合、つまり、ユーザーの要求に応じてどうすればよいでしょうか。どのような getline コマンドが役立つでしょうか。文字列名 my_file を単に cin できることはわかっていますが、目的の名前は文字列名ではなく入力に含まれています。

void save(cdStruct *ptr)    //Function that saves database info to file

        {

            ofstream dataFile;

            dataFile.open("output.txt", ios::out | ios::app);

            dataFile << ptr->title << endl;

            dataFile << ptr->artist << endl;
            dataFile << ptr->numberOfSongs << endl;

            dataFile << ptr->number << endl;

            dataFile.close();

        }
4

4 に答える 4

1

次の行を変更します。

dataFile.open("output.txt", ios::out | ios::app);

こんなものに??

dataFile.open(my_name_string, ios::out | ios::app);

はいの場合は、前にこの文字列を読み、「.txt」を追加するだけで済みます。

このコードを確認してください:

文字列名;
シン>名前;

name.append(".txt");

ストリーム dataFile;
dataFile.open(name.c_str(), ios::out | ios::app);
dataFile.close();

于 2012-11-21T16:06:15.523 に答える
0

std::string他の回答に対するコメントから、ファイル名をtoとして渡しているように聞こえますstd::ofstream::open。以前は、パラメーターではなくパラメーターC++11のみを受け入れていました(このリファレンスを参照してください)。const char *std::string

これを修正するfilename.c_str()には、 の代わりに を最初のパラメーターとして使用しますfilename。これは、null で終わる char 配列を返します。std::ofstream::open

于 2012-11-21T16:52:05.817 に答える
0

エラー メッセージは次のことstd::stringを示していchar const *ます。これで、エラーが発生した適切な場所を見つけるだけで済みます。

のオンライン ドキュメントをざっと見てみるstd::getlineと、この機能は問題ではないことがわかります。署名によりstd::string. 他に変更されたのは だけなstd::ofstream(filename, std::ios::out | std::ios::ate)ので、 のドキュメントを確認しますstd::ofstream。確かにchar const *

この問題は、交換することで迅速に解決する必要があります

std::ofstream dataFile(filename, std::ios::out | std::ios::ate);

std::ofstream dataFile(filename.data(), std::ios::out | std::ios::ate);

その後、コンパイルする必要があります。

コンパイラが表示するエラー メッセージを理解しようとし、問題が存在する可能性のある参照を検索することが非常に重要です。

于 2012-11-21T16:52:30.967 に答える
0

あなたの特定の問題は、「ユーザーが希望する出力ファイルに希望の名前を付ける」ではなく、「コマンドラインプログラムでユーザー入力を読み取る方法」です。これには、次を使用できますstd::getline

#include <iostream>
#include <string>
int main() {
    std::string filename;
    getline(std::cin, filename);
}

operator<<オーバーロードを使用したくなるかもしれませんが、

#include <iostream>
#include <string>
int main () {
     std::string filename;
     std::cin >> filename;
}

ただし、ファイル名に空白文字が含まれていると、間違った結果になります。


補足: null 以外の値を適用する場合は、null 許容ポインターを渡さないでください。

// don't: void save(cdStruct *ptr)
void save(cdStruct const &ptr) // <- ah, better
于 2012-11-21T16:06:26.330 に答える