JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=5bc1ff932e4eb67083a84a3f1344603dMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Dateiarbeit: markieren? überschreiben?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 17.03.2003, 18:07    Titel: Dateiarbeit: markieren? überschreiben? Antworten mit Zitat

Kann man in VC++ Teile aus Dateien markieren und löschen bzw. überschreiben?
Wenn ja, wie geht so was?
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 17.03.2003, 18:17    Titel: Antworten mit Zitat

Erst mit fopen() die Datei öffnen, dann mit fseek() die Position setzen und anschließend mit fwrite() überschreiben. Du musst dazu die Datei im binären Modus öffnen("wb" bei fopen() übergeben).
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Starwash
Senior JLI'ler


Alter: 40
Anmeldedatum: 22.09.2002
Beiträge: 252
Wohnort: Zossen (bei Berlin)
Medaillen: Keine

BeitragVerfasst am: 17.03.2003, 18:51    Titel: Antworten mit Zitat

Hi,
wird bei der Übergabe von "wb" nicht die alte Datei gelöscht und durch eine leere ersetzt? Müsste es nicht "rb+" oder irgendsowas übergeben werden? Oder bspw. der Strings zu erweitern von Binärdateien und dann per fseek() die Position geändert werden.

Gruss Tarek
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 17.03.2003, 19:00    Titel: Antworten mit Zitat

Apnik hat recht, sorry! Du musst die Datei im Append-Modus öffnen.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 18.03.2003, 16:06    Titel: Antworten mit Zitat

Ich habs jetzt so ausprobiert, aber es überschreibt zu viele Bytes. Sad Vielleicht könnt ihr den Fehler finden.

Inhalt der Datei Test.bin vor dem Ausführen des Programms:
Zitat:
*Eintrag 1:
abc

*Eintrag 2:
xyz

*Eintrag 3:
def

Das '*' ist ein Markierungszeichen für den Anfang eines Eintrags.

Code:
//Der 2. Eintrag soll nun von "xyz" auf "uvw" geändert werden

#include <iostream.h>
#include <stdio.h>
#include <string.h>


//Setzt den Cursor an den gewünschten Eintrag
void SetCursor(FILE* datei, int eintrag);


void main(void)
{
   //Test.bin zum Schreiben und Lesen öffnen
   FILE* datei=fopen("test.bin","rb+");

   //Cursor an 2.Eintrag setzen
   SetCursor(datei,2);
   //und Inhalt des Eintrags ändern
   fwrite("uvw",sizeof("uvw"),strlen("uvw"),datei);

   //Test.bin schließen
   fclose(datei);
}


void SetCursor(FILE* datei, int eintrag)
{
   //Cursor an den Anfang der Datei setzen
   fseek(datei, 0L, SEEK_SET);

   //Datei einlesen, bis der gewünschte Eintrag erreicht ist
   int count=0;
   while(count<eintrag)
   {
      while(true)
      {
         char buchstabe;
         //Jeden Buchstaben einzeln einlesen
         fread(&buchstabe,1,1,datei);
         //Wenn der gelesene Buchstabe ein '*' ist, Endlosschleife verlassen
         //und falls  count<eintrag  zum nächsten Eintrag springen.
         if(buchstabe=='*') break;
      }
      count++;
   }
   //Zum Ende der Schrift "Eintrag X:" springen
   fseek(datei, 12L, SEEK_CUR);
}


Exclamation ist so'n Rechteck

Inhalt der Datei Test.bin nach dem Ausführen des Programms:
Zitat:
*Eintrag 1:
abc

*Eintrag 2:
uvw Exclamation test.binrag 3:
def

_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 18.03.2003, 16:24    Titel: Antworten mit Zitat

Der Fehler ist hier:

Code:

fwrite("uvw",sizeof("uvw"),strlen("uvw"),datei);


Auszug aus der MSDN:
Zitat:

Parameters

buffer
Pointer to data to be written

size
Item size in bytes

count
Maximum number of items to be written

stream
Pointer to FILE structure


Einmal übergibst du wie groß ein Element ist, und einmal wieviele dieser Elemente schreiben willst. Demnach muss der Aufruf wie folgt lauten:

Code:

char buf[] = "uvw";
fwrite(buf, 3 /* Der String ist 3 Bytes groß */, 1 /* Das ganze nur einmal reinschreiben! */ ,datei);

_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 18.03.2003, 16:37    Titel: Antworten mit Zitat

Vielen Dank jetzt klappts soweit Laughing !

Aber ich hab da noch so ne Frage.
Nach dem ersetzten "uvw" kommt so ein Rechteck und wenn ich die Datei binär öffne und lese, stoppt er an genau der stelle und gibt danach nicht mehr Eintrag 3 aus!
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 18.03.2003, 18:58    Titel: Antworten mit Zitat

Wenn du sizeof("uvw") benutzt, gibt das (glaubich) 4 zurück, weil der die \0 am Ende des Strings noch mitzählt. Die wird dann folglich mit in die Datei geschrieben und vielleicht denkt der, die Datei sei da zuende (nur ne Vermutung).
Probier doch mal strlen("uvw").
_________________
www.messiahzone.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 18.03.2003, 19:04    Titel: Antworten mit Zitat

Tausend Dank Very Happy Very Happy Very Happy

In diesem Forum erhält man ja echt gute Antworten Exclamation

Des muss ich unbedingt weiterempfehlen Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 10:46    Titel: Antworten mit Zitat

Noch ein kleines Prob : Sad

ich will jetzt Integer reinschreiben

Code:
fwrite(20,sizeof(int),1,datei);


Geht aber net. Da kommt immer n Kompilerfehler:
int kann net in const void* umgewandelt werden.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 10:48    Titel: Antworten mit Zitat

Die Funktion erwartet an der Stelle einen Zeiger... logisch, dass das nicht geht! Du musst deinen Integer erst mit itoa() in einen String umwandeln. Oder du nimmst die Standard I/O Streamklassen. Da ist der <<-Operator für Integers überladen. ;)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 11:01    Titel: Antworten mit Zitat

Welchen Header braucht man für itoa()?
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 11:49    Titel: Antworten mit Zitat

Es geht auch einfacher, als den Integer in einen String zu verwandeln:
Code:

int nDieZahl=20;
fwrite(&nDieZahl,sizeof(nDieZahl),1,datei);

_________________
www.messiahzone.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 12:04    Titel: Antworten mit Zitat

Das Schreiben klappt jetzt, aber noch nich das Lesen eines Integers.

Ich hoffe, das ist nun das letzte Problem zu dem Thema Rolling Eyes
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 15:07    Titel: Antworten mit Zitat

Lese mit fread die gesamte Zeile ein und parse danach per sscanf. Auch ein fscanf wäre denkbar, aber dann mußt du schon beim einlesen der Zeile genau wissen, wo welcher Wert steht, was du beim lesen mit fread noch nachträglich testen kannst.

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum