|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 17.03.2003, 18:07 Titel: Dateiarbeit: markieren? überschreiben? |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 17.03.2003, 18:17 Titel: |
|
|
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 |
|
|
Starwash Senior JLI'ler
Alter: 40 Anmeldedatum: 22.09.2002 Beiträge: 252 Wohnort: Zossen (bei Berlin) Medaillen: Keine
|
Verfasst am: 17.03.2003, 18:51 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 17.03.2003, 19:00 Titel: |
|
|
Apnik hat recht, sorry! Du musst die Datei im Append-Modus öffnen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 18.03.2003, 16:06 Titel: |
|
|
Ich habs jetzt so ausprobiert, aber es überschreibt zu viele Bytes. 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);
} |
ist so'n Rechteck
Inhalt der Datei Test.bin nach dem Ausführen des Programms:
Zitat: | *Eintrag 1:
abc
*Eintrag 2:
uvw 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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 18.03.2003, 16:24 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 18.03.2003, 16:37 Titel: |
|
|
Vielen Dank jetzt klappts soweit !
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 |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 18.03.2003, 18:58 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 18.03.2003, 19:04 Titel: |
|
|
Tausend Dank
In diesem Forum erhält man ja echt gute Antworten
Des muss ich unbedingt weiterempfehlen _________________ 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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 23.03.2003, 10:46 Titel: |
|
|
Noch ein kleines Prob :
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 23.03.2003, 10:48 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 23.03.2003, 11:49 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 23.03.2003, 12:04 Titel: |
|
|
Das Schreiben klappt jetzt, aber noch nich das Lesen eines Integers.
Ich hoffe, das ist nun das letzte Problem zu dem Thema _________________ 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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.03.2003, 15:07 Titel: |
|
|
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 |
|
|
|
|
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
|