Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Textdatei einlesen

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.2009, 19:43 Uhr
~lara
Gast


Huhu,

versuche derzeit eine Textdatei einzulesen die nur aus Zahlen besteht und nur eine Zahl pro Zeile haben.
Das Ganze soll dann in ein Array eingelesen werden, am liebsten jede Zeile in ein Feld.
Hab viel probiert aber irgendwie gehts nicht
Hier mal das Stück relevanten Code:


Code:
#include <iostream>
#include <fstream>
#include "Einlesen.h"
using namespace std;

void Einlesen::einlesen()
{
     ifstream datei1;
     datei1.open("C:\\temp\\punkte.txt");
     if(!datei1.is_open())
     {
          cout << "Datei nicht gefunden" << endl;
     }
     else{
          while(!datei1.eof()){
               datei1.getline(Buffer, 250);
               cout << Buffer[250] << endl;
          }
          datei1.close();
     }
}



Er öffnet zwar die Datei und beim Debuggen ist schön zu erkennen das er sooft in der Schleife bleibt wie ich Zeilen in der Textdatei habe, also scheint es ja zu funktionieren. Nur steht im Buffer und am Ende in der Ausgabe nur Schrott. Irgendwelche kryptischen Zeichen...
Kann mir da jmd helfen ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.05.2009, 20:04 Uhr
0xdeadbeef
Gott
(Operator)


Naja, du gibst jedes mal Buffer[250] aus. Ich kenne die Definition von Buffer nicht, vermute aber aufgrund der Zeile

C++:
               datei1.getline(Buffer, 250);


, dass es sich um einen char[250] handelt. Buffer[250] ist dann das Zeichen direkt hinter dem Ende des Buffers. Das bedeutet erstens, dass es durch die getline-Zeile nie verändert wird, und zweitens einen Buffer-Overflow - du liest etwas als Teil des Buffers, das nicht mehr zum Buffer gehört; unter Umständen sogar Speicher, der dir nicht gehört. Was dabei passiert, ist mehr oder weniger zufällig (nennt sich "undefiniertes Verhalten").

Wie dem auch sei, wenn du dir sicher sein kannst, dass in der Datei nur Zahlen stehen, wäre wohl etwas wie folgendes sinnvoll:

C++:
#include <fstream>
#include <vector>

// ...

std::ifstream in("punkte.txt");
int x;
std::vector<int> zahlen;

while(in >> x) {
  zahlen.push_back(x);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 28.05.2009 um 20:04 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.05.2009, 20:09 Uhr
~lara
Gast


Jap, du hast Recht, so simpel die Lösung jetzt auch war, sie hat über 1h Zeit gefressen
Ich hab einfach aus dieser Zeile:


Code:
cout << Buffer[250] << endl;


diese gemacht:


Code:
cout << Buffer << endl;


und schon geht alles wunderbar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: