Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Datei binär oder im textmous erstellen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.05.2005, 20:44 Uhr
Lensflare



Hallo.

ich will ein kleines programm schreiben, das eine deitei schreiben und auslesen kann, die informationen zu einem beliebig grossen zweidimensionalen "schachbrett" oder matrix enthält.
Also erstmal soll die information drin sein, wie gross das feld ist, zB 100x100 und dann soll in jedem feld eine zahl gespeichert werden, die grösser sein kann als 256.

Wenn ich die datei also im textmodus öffne, kann ich ja nur "char"-werte speichern. da ich aber in einem feld auch werte über 256 speichern will, hab ich ein problem.

Deswegen denk ich mal dass ich das ganze binär machen muss oder?

ich weiss nur nicht wie ich binär schreibe und lese, nur soviel dass ich die datei mit fopen("dateiname","rb") und fopen("dateiname","wb") öffnen muss.

und gibt es eine funktion, mit der ich binär in "int" und umgekehrt umwandeln kann?

Danke. Ich freu mich auf die antworten.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.05.2005, 21:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zunächst mal folgende Frage: Solls unbedingt in c sein oder c++?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.05.2005, 22:06 Uhr
Lensflare



lieber in c++, weil ich dann noch eine klasse machen will, die die datei ausliest und als objekt speichert. So lässt es sich denk ich am besten mit den informationen arbeiten, die aus der datei gelesen werden.

Ich stelle es mir so vor, dass die klasse dann einfach die bitkombinationen der reihe nach liesst und im objekt speichert. Es müsste dann eigentlich sogar möglich sein, verschiedene variablentypen zu kombinieren. zB: die ersten 2 8er bitketten sind die x und y ausdehnung des brettes, und die restlichen 16er ketten sind die werte in den feldern.

denn die 8er ketten kann man doch als char speichern oder?

EDIT:
die datei wird natürlich viel mehr informationen haben, ich will hier nur keine verwirrung schaffen
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 28.05.2005 um 22:12 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.05.2005, 22:57 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


benutz halt fwrite, damit kannste alles schreiben, man muss nur die größe angeben.

beispiel (es kann sein das ein & fehlt oder die parameter in falscher reihenfolge, mach das grad ausm kopf)


C++:
int a = 43444;
fwrite(a, sizeof(a), 1, file);



das schreibt dir dann 4 Bytes in deine Datei (natürlich solltest du mit "b-bit" öffnen) die dem Wert 43444 entsprechen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.05.2005, 23:05 Uhr
Lensflare



YEAH!
das ist es!

hab schon fast die lösung gehabt, nur mit fwrite(a, 1, 1, file) gearbeitet, was nur für char gilt.
jetzt weiss ich, das ich an dieser stelle die grösse der variable angeben muss

danke, endlcih komm ich weiter.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.05.2005, 19:12 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
du könntest die Werte auch im Textmodus speichern.
Mit C würden fprintf und fscanf dann die Arbeit erledigen.
Mit C++ hast du noch ganz andere Möglichkeiten.
Als Textdatei mit C++ z.B. so:

C++:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

template<typename T>
T** load2DArray(string filename,size_t& X)
{
    size_t i,j,Y;
    ifstream in(filename.c_str());
    if(!in)
    {
        cerr<<"Fehler beim öffnen der Datei!"<<endl;
        return NULL;
    }
    in>>X;//X wird für den Aufruf von delete2DArray benötigt
    in>>Y;

    T** arr = new T*[X];
    for(i=0;i<X;++i)
        arr[i]= new T[Y];
    for(i=0;i<X;++i)
    {
        for(j=0;j<Y;++j)
            in>>arr[i][j];
    }
    in.close();

    return arr;
};

template<typename T>
void save2DArray(size_t firstDim,size_t secondDim,T** _arr,string filename)
{
    ofstream out(filename.c_str());
    if(!out)
    {
        cerr<<"Fehler beim öffnen der Datei!"<<endl;
        return;
    }
    out<<firstDim<<' '<<secondDim<<'\n';

    for(size_t i=0;i<firstDim;++i)
    {
        for(size_t j=0;j<secondDim;++j)
            out<<_arr[i][j]<<' ';
        out<<'\n';
    }
    out.close();
}


template<typename T>
void delete2DArray(T** arr,size_t s)
{
    for(int i=0;i<s;++i)
        delete[] arr[i];
    delete []arr;
}


int main()
{
    //Testdatei mit Testdaten füllen
    string file;
    size_t X;
    size_t Y;
    size_t i;
    cout<<"Zeilen ?: ";
    cin>>X;
    cout<<"Spalten ?: ";
    cin>>Y;
    //Speicher besorgen
    int** arr = new int*[X];
    for(i=0;i<X;++i)
        arr[i]= new int[Y];
    //Array mit Testdaten füllen
    int wert=1;
    for(i=0;i<X;++i)
    {
        for(size_t j=0;j<Y;++j)
        {
            arr[i][j]=wert;
            ++wert;
        }
    }
    cout<<"Name des Files zum speichern?:";
    cin>>file;

    //Array speichern
    save2DArray<int>(X,Y,arr,file);
    //Speicher des Testarrays freigeben
    delete2DArray<int>(arr,X);
    //Array aus Datei dynamisch erstellen
    int** fileArray = load2DArray<int>(file,X);

    //Zum Testen anzeigen
    if(fileArray!=NULL)
    {
        for(i=0;i<X;++i)
        {
            for(size_t j=0;j<Y;++j)
                cout<<fileArray[i][j]<<' ';
            cout<<endl;
        }
        delete2DArray<int>(fileArray,X);
    }

    return 0;
}



Diese Lösung arbeitet halt wirklich mit Arrays,und setzt voraus dass die Datei "passend" die Werte für das Array liefert.Solange die Datei nur über die beiden Funktionen "bearbeitet" wird sollte das gegeben sein.
Kannst dir langfristig ja mal die Containerklassen der STL anschauen.Die bieten einiges mehr an Komfort und Sicherheit.
Die Funktionen würden prinzipiel auch mit float,double char etc. funktionieren.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.05.2005, 21:44 Uhr
Lensflare



ich kenn mich leider gar nicht mit templates aus.
viele zeilen aus dem code versteh ich nicht.

deswegen kann ich das ganze nicht nachvollziehen.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.05.2005, 21:52 Uhr
Spacelord
Hoffnungsloser Fall


Dann denk dir die template Geschicht weg und setz überall wo T steht int ein .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
31.05.2005, 11:45 Uhr
~Lensflare
Gast


ich könnte ja auch statt die variablen einzeln zu speichern, die ja sowieso in einem objekt sind, das ganze objekt speichern, oder?
dann müsst ich mir die reihenfolge der gespeicherten variablen nicht merken.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
31.05.2005, 12:07 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ja warum nicht, du musst nur aufpassen das dir der compiler die objekt-größe nicht optimiert (also z.b von 15Bytes auf 16 o.ä hab ich schon mehrmals bemerkt das er manchmal dann in der release (beim vc) dann ein struct 8bytes groß gemacht obwohls eigentlich 7 bytes sein sollten)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: