3

このコードを使用して、文字列「foo」をバイナリ形式で 10 回出力しようとしました。しかし、なぜそれを行う機能が機能しないのでしょうか?

#include <iostream>
#include <fstream>
using namespace std;

template <typename T> void WriteStr2BinFh (string St, ostream &fn) {
     for (unsigned i = 0; i < St.size(); i++) {
         char CStr = St[i];
         fn.write(&CStr.front(), CStr.size());
     }
     return;
}

int main() {
   string MyStr = "Foo";
   ofstream myfile;
   myfile.open("OuputFile.txt", ios::binary|ios::out);

   // We want to print it 10 times horizontally
   // separated with tab

  for (int i = 0; i < 9; i++) {
      WriteStr2BinFh(Mystr+"\t", myfile);
   }

   myfile.close();   
}
4

4 に答える 4

9

ここには非常に多くの間違いがあります。

for ループ条件は i < 10 である必要があります。

テンプレートを使用しているのに、テンプレート化されたパラメーター T を使用していないのはなぜですか?

CStr でメソッド front() を呼び出していますが、CStr は文字列ではなく文字であるため、それがどのようにコンパイルされるかさえわかりません。

CStr が文字列であると仮定すると、& を使用して front() イテレータのアドレスを取得したくはありません。代わりに、次のように言いたいとします。

fn.write(St.c_str(), St.size());

また、St.size() の反復をループしたくありません。上記を行うだけです。

于 2009-03-26T07:06:42.243 に答える
3

ああ、たくさんのエラーがあります:

  • int main - 値を返す必要があります。
  • 関数で template< typename T > を使用しません。
  • Mystr - 関数呼び出しの名前が正しくありません。C++ の名前は大文字と小文字が区別されます。
  • char CStr - メソッド front がなく、std::string もありません。
  • ベクトルの場合のように、最初の要素のアドレスを取得できませんでした。
  • std::string を const 参照として受け入れる方が良いでしょう。
  • 文字列ヘッダーを含めるのを忘れました。
  • ...

コードの整理と命名を使用して、例を修正しました。

#include <iostream>
#include <fstream>
#include <string>

void WriteStr2BinFh( const std::string& St, std::ostream &out ) 
{
    out.write( St.c_str(), St.size() );
}

int main() 
{
    std::string MyStr = "Foo";
    std::ofstream myfile( "OuputFile.txt", std::ios::binary | std::ios::out );


    for (size_t i = 0; i < 9; ++i) 
    {
        WriteStr2BinFh( MyStr+"\t", myfile );
    }

   myfile.close();   
   return 0;
}

std::fill_nしかし、アルゴリズムを使用することをお勧めします

std::fill_n( std::ostream_iterator< std::string >( myfile, "\t" ), 10, MyStr );
于 2009-03-26T07:18:55.193 に答える
1

バイナリモードでio操作を行うための重要なポイント:

  • ファイルは、フラグios :: out(出力モード)およびios :: binary(バイナリモード)を使用して、出力モードとバイナリモードで開く必要があります。
  • 関数writeは2つのパラメーターを取ります。最初のパラメーターは、書き込まれるデータのタイプchar *であり、2番目のパラメーターは、バイナリファイルに書き込まれるデータのサイズを要求するタイプintです。
  • 最後にファイルを閉じる必要があります。

    void write_to_binary_file(WebSites p_Data)
    {
        fstream binary_file("c:\\test.dat",ios::out|ios::binary|ios::app);
        binary_file.write(reinterpret_cast<char *>(&p_Data),sizeof(WebSites));
        binary_file.close();
    }
    

    このI/Oバイナリ関数は、関数にいくつかのデータを書き込みます。

  • ファイルは、ios::outおよびios::binaryを使用して出力およびバイナリモードで開かれます。もう1つの指定子ios::appがあります。これは、ファイルが追加モードでも開かれていることをオペレーティングシステムに通知します。これは、新しいデータセットがファイルの最後に追加されることを意味します。

  • 上記で使用した書き込み関数には、文字ポインタ型としてのパラメータが必要です。したがって、型コンバーターreinterpret_castを使用して、構造をchar*型に型キャストします。

于 2009-03-26T07:39:23.427 に答える
1

まず、それは単一の文字であるchar CStrと言います。CStr次に、fn.write(&CStr.front(), CStr.size());その文字を のようなコンテナーとして扱いますがstd::vector<>、これはもちろんコンパイルできません。

WriteStr2BinFh私がチェックしていないまでのすべてが問題ないと仮定すると、これはどのようにWriteStr2BinFh見えるべきか(可能性があるか):

void WriteStr2BinFh(const string& St, ostream &fn)
{
    for(string::iterator it = St.begin(); it != St.end(); ++it)
    {
        fn.put(*it);
    }
}

または、できれば

void WriteStr2BinFh(const string& St, ostream &fn)
{
    fn.write(St.c_str(), St.length());
}
于 2009-03-26T07:07:51.943 に答える