hallo
ich möchte die pfade für meine texturen aus einer textdaei auslesen.
wenn ich das so mache, funktioniert es:
fgets(Test,25,pDatei); // bei 24 zeichen langem pfad
D3DXLoadSurfaceFromFile(VecTileSurface[0], 0,0,Test,0,D3DX_DEFAULT,0,0);
dummerweise ist der pfad nicht immer gleich lang und wenn ich fogendes schreibe funktioniert es nicht:
fgets(Test,100,pDatei);
hab es auch schon mit tricks probiert:
fgets(Test,100,pDatei);
strncpy(Buffer,Text,sizeof(Text));
D3DXLoadSurfaceFromFile(VecTileSurface[0], 0,0,Buffer,0,D3DX_DEFAULT,0,0);
hat leider auch nicht funktioniert :-(
komischerweise wird der pfad immer richtig dargestellt, wenn ich ihn mit einer messagebox ausgebe.
ach ja meine textdatei:
4
1
3 3 3 3 3 3 3 3
1 1 0 0 0 0 1 2
1 1 0 2 0 0 1 2
1 3 0 0 3 0 1 2
0 1 0 0 0 0 1 2
1 1 0 1 0 0 1 2
..\\\\media\\\\tile_gras.png
..\\\\media\\\\tile_sand.png
..\\\\media\\\\tile_asphalt.png
..\\\\media\\\\tile_fels.png
bin jetzt volle 2 tage an diesem sch**** problem und bin langsam aber sicher am verzweifeln.
für antworten bin ich sehr dankbar!
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Könnte an den Stringbegrenzungen liegen.
Jeder String sollte begrenzt werden, normalerweise mit ASCII 0x00.
Beim hineinschreiben der Pfade setzt du am Ende des Strings das 0x00,
beim Einlesen solltest du folgendes machen:
unsigned char ucByte;
CString cstrEinzulesenderPfad;
while(fgetc(DeinFile, ucByte) != 0x00)
{
cstrEinzulesenderPfad += ucByte;
}
cstrEinzulesenderPfad += 0x00;
Du liest also Byte für Byte die Zeichen ein, bis das Ende des Strings
erreicht ist (am 0x00 erkennbar) und kopierst das Byte in den String.
Gruß
IDE-ATAPI
Das bedeutet, dass die längenangabe (und auch der speicherbereich, wo die eingelesenen zeichen landen) die größe der längsten zeile haben sollte (oder zur sicherheit etwas mehr). Das problem dürfte im letzten satz des zitats liegen: "The newline character, if read, is included in the string."
D.h. es ist meistens noch ein extra zeichen am ende (außer evtl. in der letzten zeile).
Gibt man die genaue länge des dateinamens an, hört fgets vor dem zeilenende auf und es wird kein extra zeichen an den dateinamen angefügt.
Die lösung ist das löschen aller überflüssigen zeichen:
#define TESTSIZE 1024
char Test[TESTSIZE];
fgets(Test,TESTSIZE-1,pDatei);
Test[TESTSIZE-1]=0;//das letzte byte im speicherblock auf '\0' setzen
char *tmp=Test;
while(*tmp>=0x20) tmp++;
*tmp=0;
mr.escape
vielen dank euch beiden, dass ihr euch zeit genommen und mir so gute antworten gegeben habt!!!
hab die idee von mr.escape ausprobiert, weil ich sie gerade besser verstand.
hat funktioniert. :-)
gruss yves
Ich fürchte, IDE-ATAPIs variante hätte nicht funktioniert, denn zeilen werden in textdateien nicht mit '\0' getrennt (sondern je nach system mit CR, LF oder CRLF bzw. 0x0d, 0x0a oder 0x0d+0x0a).
Mit:
while((ucByte=(unsigned char)fgetc(DeinFile)) >= 0x20)
hingegen, kommt seine lösung eigentlich auf das gleiche raus, was ich vorschlug (er liest mit fgetc(), bis es reicht und ich lasse fgets() lesen und suche danach im speicher).
Gibt es zeilen, die länger als etwa 1000 zeichen sind, ist seine version besser, da mit CString vermutlich sehr lange zeichenketten möglich sind, dafür ist meine version sicher um größenordnungen schneller (würde aber nur bei sehr vielen verarbeiteten zeilen und häufig wiederholtem einlesen überhaupt nennenswert auffallen) und auch in C zu verwenden.
mr.escape
hi mr.escape,
"Ich fürchte, IDE-ATAPIs variante hätte nicht funktioniert, denn zeilen werden in textdateien nicht mit '\0' getrennt (sondern je nach system mit CR, LF oder CRLF bzw. 0x0d, 0x0a oder 0x0d+0x0a)."
Da hast du recht, die Ausgangsdatei darf natürlich nicht mit dem Editor erstellt werden, deswegen mein Satz: "Beim hineinschreiben der Pfade setzt du am Ende des Strings das 0x00".
happy coding,
Gruß
IDE-ATAPI
So kann man das natürlich auch sehen, wenn ich aber eine textdatei habe, die eigentlich keine mehr ist und auch nicht mit einem normalen texteditor bearbeitet werden darf, kann ich gleich ein eigenes binärformat verwenden, wo die längen der pfade den strings jeweils vorangestellt sind (wie in CString und bei pascalschen zeichenketten üblich) und ich beim laden sofort weiß, wie viel platz gleich erforderlich ist.
Die verwendung von (leicht editierbaren) textdateien ist eben einfach praktisch beim testen und probieren und ist auch die vorgabe von yves3.
mr.escape