2

文字列ストリーミングの電話検索プログラムをファイル ストリーミングに変換しようとしています. 何かが足りないのですが、行き詰まっています. ofstream プロセスでこれを機能させるためにどのメンバーを使用できますか?

ofstream& process (ofstream &os, vector<PersonInfo> people)
{
    // for each entry in people
    for (vector<PersonInfo>::const_iterator entry = people.begin();
                entry != people.end(); ++entry) {    
        ofstream formatted, badNums; // objects created on each loop

        // for each number
        for (vector<string>::const_iterator nums = entry->phones.begin();
                nums != entry->phones.end(); ++nums) {  
            if (!valid(*nums)) {           
                badNums << " " << *nums;  // string in badNums
            } else                        
                // ``writes'' to formatted's string
                formatted << " " << format(*nums); 
        }
        if (badNums.empty())      // there were no bad numbers
            os << entry->name << " "    // print the name 
               << formatted.str() << endl; // and reformatted numbers 
        else                   // otherwise, print the name and bad numbers
            cerr << "input error: " << entry->name 
                 << " invalid number(s) " << badNums.str() << endl;
    }

    return os;
}
4

3 に答える 3

4

ofstreamまず、ファイルを開く (インスタンスを作成する) 時点を除いて、 は必要ありません。出力ストリーム インターフェイスは によって定義されstd::ostreamます。std::ofstreamはこれから派生し std::ostringstream(出力は になる可能性がありますstd::string)、ほとんどのアプリケーションでは、ローカル プログラマーによって記述された他の 2 つの関数があります。あなたの場合(私が問題を正しく理解していれば)、あなたが望むのは次のとおりです。

std::ostream& process( std::ostream& os,
                       std::vector<PersonInfo> const& people )
    //  Note the use of a const reference above.  No point
    //  in copying the entire vector if you're not going to
    //  modify it.
{
    for ( std::vector<PersonInfo>::const_iterator entry = people.begin();
            entry != people.end();
            ++ entry ) {
        std::ostringstream formatted;
        std::ostringstream badNums;
        //  ...
        if ( badNums.str().empty() ) {
            os << ... << formatted.str() << std::endl;
        } else {
            os << ... << badNums.str() << std::endl;
        }
    }
    return os;
}

さまざまなタイプに注意してください。std::ostream出力先のタイプとは関係なく、出力をフォーマットします。 std::ofstreamそれから派生し、宛先としてファイルを提供します。 std::ostringstreamそれから派生し、std::stringas 宛先タイプを提供します。は引数としてstd::ostream を取りstd::streambuf*、宛先の型を指定します。

于 2012-11-05T18:05:07.657 に答える
0

ofstreamこの関数の内部部分に sを使用する必要はないようです。実際、ストリームをまったく使用する必要はありませstd::stringん。

ofstream& process (ofstream &os, vector<PersonInfo> people)
{
    // for each entry in people
    for (vector<PersonInfo>::const_iterator entry = people.begin();
                entry != people.end(); ++entry) {    
        string formatted, badNums; // objects created on each loop

        // for each number
        for (vector<string>::const_iterator nums = entry->phones.begin();
                nums != entry->phones.end(); ++nums) {  
            if (!valid(*nums)) {           
                badNums += " " + *nums;  // string in badNums
            } else                        
                // ``writes'' to formatted's string
                formatted += " " + format(*nums); 
        }
        if (badNums.empty())      // there were no bad numbers
            os << entry->name << " "    // print the name 
               << formatted << endl; // and reformatted numbers 
        else                   // otherwise, print the name and bad numbers
            cerr << "input error: " << entry->name 
                 << " invalid number(s) " << badNums << endl;
    }

    return os;
}
于 2012-11-05T18:05:50.033 に答える
0

ファイルを ostream に関連付けることは決してないため、コンパイラは、ファイルに書き込むデータをどう処理するかを知りません。

ofstream& process (ofstream &os, vector<PersonInfo> people)
{
    os.open("Data.txt"); //open file to be used
    if(!os.is_open())
        std::cerr << "Error opening file!\n";
    //rest of code goes here
}

編集: プログラムをもう一度読んだ後、ofstream を間違って使用していることに気付きました。Ofstream は、ファイルを開いて書き込むためのものです。プログラムには、多くの構文エラーと論理エラーがあります。詳細については、こちらを参照してください

于 2012-11-05T18:06:08.253 に答える