Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicherleck?

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
12.06.2004, 20:58 Uhr
Anfänger00



Hallo,
ich möchte mit iftream einen Text Zeile für Zeile in den speicher lagern.
Nur leider scheint das nicht ganz zu gelingen (Programmabsturz):

C++:
    char Dateiname[80];
    char *speicher[255];// anders hat der compiler gemeckert
    int i=0;
    cout<<" Geben sie einen Dateinamen ein: ";
    cin>>Dateiname;

    ifstream lese(Dateiname);
    do
    {
        speicher[i] = new char[255]; //hier soll speicher für eine Zeile geholt werden
        i++;
        lese.getline(speicher[i],255);
    }while (speicher[i*255] == "/" || speicher[i*255] == "\n") ;
    lese.close();
    cout<<"\n "<<Dateiname<<":\n";
    cout<<" "<<speicher;
    for(int j;j<i;i++)
    {
        delete[] speicher[i];
    }
    delete[] speicher[255]; //speicherleck?
    getch();
}




Bearbeitung von Pablo:

Einrücken erhöhrt die Lesbarkeit


Dieser Post wurde am 12.06.2004 um 21:02 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.06.2004, 21:07 Uhr
Pablo
Supertux
(Operator)


char *speicher[255];
das ist ein Zeiger auf ein Array von 255 Feldern. Die hast du gerade mit der letzten for schleife gelöscht, die übrigens etwas merkwürdiges hat:

C++:
for(int j;j<i;i++)
    {
        delete[] speicher[ i ];
    }



meinst du etwa nicht?

C++:
for(int j=0;j<i;i++)
    {
        delete[] speicher[ j ];
    }



wenn j nicht initialisiert wird, dann hat j einen unbekannten Wert und wenn j > i, dann wird die Schleife nicht mehr ausgeführt? Außerdem sollte es nicht speicher [ j ] heißen? Wie hast du den Speicher für *speicher[] erstellt?


C++:
delete[] speicher[255]



da sollte nur

C++:
delete[] speicher;


sein.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.06.2004, 21:16 Uhr
Anfänger00



Ich hab wohl schon länger nichts mehr geproggt,da kann das mit dem i schon passieren.
Ich weiß das da eigentlich nur delete[] speicher stehen sollte.
Der Compiler war aber anderer Meinung

Dieser Post wurde am 12.06.2004 um 21:17 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.06.2004, 21:49 Uhr
Anfänger00



so jetzt müsste es gehen aber:

C++:
char Dateiname[80];
char Folder[80];
char **speicher;// anders hat der compiler gemeckert
int i=0;
cout<<" Geben sie einen Dateinamen ein: ";
cin>>Dateiname;

speicher = new char*[1000]; // Anzahl der Zeilen

ifstream lese(Dateiname);
do
{
speicher[i] = new char[255];
     //hier soll speicher für eine Zeile geholt werden
    lese.getline(speicher[i],255);
    i++;
}while (speicher[i-1][0] == "/" || speicher[i-1][0] == "\n"); //iso c++ ..error

lese.close();

cout<<"\n "<<Dateiname<<":\n";

for(int x=0;i<i;x++)
{
    cout<<speicher[x]<<"\n";
}

for(int j=0;i<j;j++)
{delete[] speicher[j];}
delete[] speicher; //speicherleck?



EDIT:
Achso jetzt versteh ich den error: iso c++ C++ forbids comparison between pointer and integer.
Aber wie kann ich denn dann vergleichen?

Dieser Post wurde am 12.06.2004 um 21:54 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.06.2004, 21:59 Uhr
0xdeadbeef
Gott
(Operator)


Mal davon ab, dass ich an deiner Stelle

C++:
std::vector<std::string> speicher;


benutzen würde, der Speicherfehler war eher hier:

C++:
do {
//...
} while (speicher[i-1][0] == "/" || speicher[i-1][0] == "\n");


Was du meinst, ist:

C++:
do {
//...
} while (speicher[i-1][0] == '/' || speicher[i-1][0] == '\n');


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.06.2004, 22:16 Uhr
Anfänger00



und wie benutze ich diesen vector?
und was muss ich includieren?

Denn es wird leider kein text ausgegeben.

Dieser Post wurde am 12.06.2004 um 22:17 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.06.2004, 22:38 Uhr
0xdeadbeef
Gott
(Operator)



C++:
#include <algorithm> //für std::getline
#include <fstream>
#include <iostream>
#include <iterator> //für std::ostream_iterator
#include <string>
#include <vector>

int main() {
  std::ifstream datei;
  std::vector<std::string> speicher;
  std::string dateiname;

  std::cout << "Dateiname eingeben:" << std::flush;
  std::cin >> dateiname;
  datei.open(dateiname.c_str());

  while(datei) {
    std::string s;
    std::getline(datei, s);
    speicher.push_back(s);
  }

  std::cout << std::endl
            << dateiname << std::endl;

  std::copy(speicher.begin(), speicher.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
  //oder auch
  //for(std::vector<std::string>::iterator i = speicher.begin(); i != speicher.end(); ++i)
  //  std::cout << *i << std::endl;
  //oder
  //for(int i = 0; i < speicher.size(); ++i)
  //  std::cout << speicher[i] << std::endl;

  // Nachher kein delete mehr nötig

  return 0;
}


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

Dieser Post wurde am 12.06.2004 um 22:47 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.06.2004, 00:00 Uhr
Anfänger00



Ich habs jetzt mal mit vector gemacht!
Aber es gibt da noch zwei kleine,für mich unverständliche Probleme:
1.Wird die Datei nicht gefunden,wenn ich einmal eine ungültige Eingabe mache.
2.Es findet kein Zeilenumbruch statt,wenn die Zeile nicht voll ist.

C++:
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <vector>
using namespace std;

int main()
{
vector<string>speicher;
ifstream fin;
char Dateiname[80];

while(true)
{  
    
    cout<<"\n Geben sie einen Dateinamen ein: ";
    cin>>Dateiname;
    fin.open(Dateiname);
    if(!fin)
        {
            cout<<" Datei kann nicht gefunden oder gelesen werden!";
            fin.close();
            getch();
            
            
        }
    else
    {break;}        
}


while(fin)
{  
    string buffer;
    getline(fin,buffer);
    speicher.push_back(buffer);
}



fin.close();

cout<<"\n "<<Dateiname<<":\n";

for(int i = 0; i < speicher.size(); ++i)
{
    cout << speicher[i] << endl;
}



getch();
}


Dieser Post wurde am 13.06.2004 um 00:01 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.06.2004, 13:15 Uhr
Anfänger00



Problem 2 hab ich lösen können.
Aber 1. bekomm ich nicht hin.
EDIT:
Lies sich auch lösen:
Einfach erst mit einem neuen ifstream Objekt überprüfen und dann mit fin öffnen.

Dieser Post wurde am 13.06.2004 um 14:15 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.06.2004, 15:31 Uhr
0xdeadbeef
Gott
(Operator)


Mit

C++:
fin.clear();


setzt du die Fehlerflags wieder auf normal, das solltest du vor fin.open(Dateiname); einfügen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: