Frage

Mit diesem Code habe ich versucht, die Zeichenfolge „foo“ 10-mal drucken im Binärformat. Aber warum nicht die Funktion, die sie arbeiten, zu tun?

#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();   
}
War es hilfreich?

Lösung

Es gibt so viel falsch hier, ich werde einfach alles Liste sehe ich:

Ihre für Schleifenbedingung soll ich 10

Warum verwenden Sie eine Vorlage aber nicht die templatized Parameter T?

Sie den Aufruf der Methode Front () auf CStr, aber CStr ist ein Zeichen, kein String, so dass ich weiß nicht einmal, wie das kompiliert wird.

Unter der Annahme, CStr eine Zeichenfolge war, wollen Sie nicht die Adresse der Vorderseite () Iterator nehmen und verwenden, stattdessen wollen Sie etwas sagen wie:

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

Und Sie wollen nicht Schleife für St.size () Iterationen. Tun Sie einfach das oben.

Andere Tipps

omg, es eine Menge Fehler haben:

  • int main - sollte Rückgabewert;
  • Sie keine Vorlage verwenden in Ihrer Funktion;
  • MeinStr - nicht korrekte Namen in Funktionsaufruf, Namen in C ++ sind Fall sencetive;
  • char CStr - nicht Methode vorne haben, und std :: string zu;
  • Sie konnte nicht Adresse des ersten Elements erhalten wie im Falle mit dem Vektor;
  • wird es besser sein, wenn Sie std :: string als konstante Referenz akzeptiert;
  • vergessen Sie String-Header enthalten;
  • ...

fixiert Ihr Beispiel mit Ihrem Code organisieren und Ihrer Benennung:

#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;
}

aber ich habe reccomended std::fill_n Algorithmus verwenden

std::fill_n( std::ostream_iterator< std::string >( myfile, "\t" ), 10, MyStr );

Zuerst sagt char CStr dass CStr ein einzelne Zeichen ist. Zweitens fn.write(&CStr.front(), CStr.size()); behandelt dieses Zeichen als einen Behälter, wie std::vector<>, was natürlich nicht kompiliert werden.

Unter der Annahme, dass alles bis zu WriteStr2BinFh in Ordnung ist, die ich nicht überprüft haben, das ist, wie WriteStr2BinFh sollte (könnte) aussehen:

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

oder vorzugsweise

void WriteStr2BinFh(const string& St, ostream &fn)
{
    fn.write(St.c_str(), St.length());
}

Wichtige Punkte für einen IO-Betrieb im Binär-Modus zu tun:

  • hat die Datei in der Ausgabe und Binär-Modus mit den Flags ios :: out (Ausgabemodus) und ios :: binary (Binär-Modus)
  • geöffnet werden
  • Die Funktion write hat zwei Parameter. Der erste Parameter ist vom Typ char * für die Daten geschrieben werden sollen, und das zweite ist int vom Typ für die Größe der Daten zu fragen, um die binäre Datei geschrieben werden.
  • Datei am Ende geschlossen werden muss.

    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();
    }
    

    Diese E / A-Binär-Funktion schreibt die Funktion einige Daten.

  • Die Datei wird im Ausgang und Binär-Modus mit ios :: out und ios geöffnet :: binary. Es gibt eine weitere Spezifikations ios :: app, die das Betriebssystem erzählt, dass die Datei auch im Append-Modus geöffnet wird. Das bedeutet, jede neue Reihe von Daten an das Ende der Datei angehängt werden.

  • Die Schreibfunktion oben verwendet wird, muss der Parameter als Zeichenzeigertyp. So verwenden wir einen Typkonverter reinterpret_cast die Struktur in char * Typ typisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top