Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sheddex

unregistriert

1

29.12.2006, 23:08

Der gleiche Code an verschiedenen Stellen, einmal geht's...

Ich habe eine Klasse für den Abschnitt einer Welt. Dieser Abschnitt soll
aus einer txt-Datei ausgelesen werden. Den Pfad zur Datei übergibt man der Methode "Create", die so aussieht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool Cell::Create(wchar_t* Path)
{
   //Variablen

   wchar_t FileCell[100];
    
   //Datei öffnen

   std::basic_ifstream<wchar_t> Input(Path);
    
   //Prüfen ob die Datei geöffnet wurde

   if (Input.is_open() == false)
      return false;

   //Datei lesen

   Input.read(FileCell, 100 * sizeof(wchar_t));

   //Datei schließen

   Input.close();

   //Text anzeigen

   std::wcout << FileCell;

   _getch();
}


Soweit so gut, alles wird korrekt abgezeigt bis man eine Taste drückt. Dieses Methode wird in der Main-Funktion aufgerufen, in der sonst nichts geschieht, außer ein weiteres _getch() nach dem Aufruf. Das Problem ist nun, dass dieses _getch() ignoriert wird, scheinbar stürzt das Programm einfach ab, man kann alles Mögliche nach dem Methodenaufruf hinzufügen, das Programm kommt nicht dorthin.

Wenn ich nun den ganzen Code aus der Methode direkt in die Main verlagere funktioniert alles, es stürzt nicht ab und ich kann noch aufrufen was ich will...

Dumm eben dass der Code schon in der Methode sein sollte... weiß vielleicht jemand woran das liegen könnte?

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

30.12.2006, 09:46

Was passiert denn, wenn in deiner Datei mehr als 100 Zeichen drin sind?

In diesem Fall wird das FileCell Feld garantiert nicht mit einer \0 enden. Aber, selbst wenn in der Datei weniger Zeichen sind, könnte die terminierende \0 fehlen. Das ist aber auch das Einzige, was mir hier als Feherquelle ins Auge sticht.

Ohne \0 am Ende kann das "std::wcout << FileCell;" Probleme machen. Ausserdem würde ich da wenigstens noch einen "std::flush" reinschreiben, damit das sicher auch sofort ausgegeben wird. wcout kann ja ein gepufferter Ausgabestrom sein.

Hier bietet sich ein Debugger-Break-Point auf der Anzeigezeile an.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Sheddex

unregistriert

3

30.12.2006, 13:10

Also ich hab' aus dem wchar_t FileCell[100] mal ein wchar_t* FileCell gemacht, sowie nach dem Laden ein FileCell[99] = L'\0' eingefügt.

Das "Lustige" bei der Deklaration:

wchar_t* FileCell = NULL; //Absturz, Lesefehler
wchar_t* FileCell; //Alles geht

Naja, immerhin hab' ich jetzt nen Ansatz, mal schaun was draus wird...

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

4

30.12.2006, 14:19

Au Weia!!!

Zitat von »"DragonFlame"«

Also ich hab' aus dem wchar_t FileCell[100] mal ein wchar_t* FileCell gemacht, sowie nach dem Laden ein FileCell[99] = L'\0' eingefügt.

Das "Lustige" bei der Deklaration:

wchar_t* FileCell = NULL; //Absturz, Lesefehler
wchar_t* FileCell; //Alles geht

Naja, immerhin hab' ich jetzt nen Ansatz, mal schaun was draus wird...


Bleib doch lieber bei wchar_t FileCell[100], dann hast du wenigstens auch einen Speicherbereich belegt, in dem die Daten gespeichert werden.

So wie du das umgebaut hast, gibt das wilde Speicherzugriffe, die bei der Adresse NULL glücklicherweise crashen und in der zweiten Variante irgendwo in den Speicher schreiben.

Die \0 an Position 99 ist schon eher die richtige Idee.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Sheddex

unregistriert

5

30.12.2006, 19:58

Naja, eigentlich klar dass es nur so gehen kann:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
bool Cell::Create(wchar_t* Path)
{
   //Variablen

   wchar_t FileCell[100];
    
   //Datei öffnen

   std::wifstream Input(Path);
    
   //Prüfen ob die Datei geöffnet wurde

   if (Input.is_open() == false)
      return false;

   //Datei lesen

   Input.read(FileCell, 100 * sizeof(char));

   //Datei schließen

   Input.close();

   //Nullterminierung anhängen

   FileCell[99] = L'\0';

   //Text anzeigen

   std::wcout << FileCell;

   _getch();

   return 0;
}


Die txt File ist ja in ANSI codiert...

Werbeanzeige