Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Einlesen aus Datei

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
21.06.2010, 15:36 Uhr
Lenja



Hallo,

ich bin noch totaler C++-Neuling und habe eine Frage:
Grundsätzlich möchte ich aus einer Textdatei der Form

1 1 1 4
1 2 2 5
1 3 2 6
2 1 3 5
...

die Werte der einzelnen Zeilen auslesen (insgesamt 11250 Zeilen). Dh im ersten Schritt muss ich schauen, wie viele Zeilen mit zB. "1" anfangen. Das wären in diesem Fall 3.
Ich gehe also die Datei durch bis das erste mal am Zeilenanfang keine 1 mehr steht.

Im zweiten Schritt müsste ich die Datei nochmal durchgehen, um die anderen Werte aus den Zeilen mit der "1" am Anfang auszulesen. Ich kann es nicht alles in einem Schritt machen!

Nun funktioniert der erste Teil recht gut mit diesem Programm:


Code:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{    
    int inst = 1;
    int pnr;
    int anzprod;
    int anzfeat;
    int instnr;
    
    int i = 0;
    int j = 0;
    int k = 0;
    
    cin>>instnr;

    ifstream anford;
    anford.open ("anfsmall.txt");
    
    if(!anford)
    {
       cout<<"Fehler!"<<endl;          
    }
    else
    {
       while(inst < instnr+1)
       {
          anford>>inst>>pnr;
          anford.ignore(10,'\n');
          
          if(inst == instnr)
          {
             i++;
             if(pnr == 1)
             {
                // Anzahl Features festlegen
                j++;    
             }
          }
          k++;              
       }
       anzfeat = j;
       anzprod = i/j;  
            
    }
    anford.close();

    getchar();
    system("PAUSE");
    return 0;
}



Wenn ich nun aber die Datei nochmal öffne und die Datei nochmal bis dorthin auslese, wo der erste Wert größer ist als der, den ich haben will, dann gibt mir Windows ein Problem aus. Mein Programm muss daraufhin geschlossen werden

Kann mir jemand sagen, wo das Problem liegt?

Liebe Grüße
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.06.2010, 15:55 Uhr
0xdeadbeef
Gott
(Operator)


Das kann ich ohne den restlichen Code nicht wirklich sagen, aber du kannst die ganze Problematik vermeiden, indem du das ganze gleich in geeignete Datentypen einliest. Etwa

C++:
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

int main() {
  std::ifstream in("anfsmall.txt");
  std::string zeile;
  std::vector<std::vector<int> > matrix;

  while(std::getline(in, zeile)) {
    std::istringstream parser(zeile);
    std::istream_iterator<int> it_end;

    matrix.push_back(std::vector<int>(std::istream_iterator<int>(parser), it_end));
  }
}


Danach lässt sich das ganze bequem per []-Operator ansprechen (in etwa wie ein zweidimensionales Array).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 21.06.2010 um 15:57 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.06.2010, 12:26 Uhr
Lenja



Der ganze Code sieht so aus (2. Teil noch auskommentiert):


C++:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

void printarray(int** rpf,int anzprod, int anzfeat)
{
     for (int n=0; n<anzprod; n++)
     {
         for (int m=0; m<anzfeat; m++)
         {
             cout <<rpf[n][m] <<" ";
         }
         cout <<endl;
     }
}

int main(int argc, char *argv[])
{    
    int inst = 1;
    int pnr;
    int fnr;
    int val;
    int anzprod;
    int anzfeat;
    int instnr;
    
    int i = 0;
    int j = 0;
    int k = 0;
    
    cin>>instnr;

    ifstream anford;
    anford.open ("anfsmall.txt");
    
    if(!anford)
    {
       cout<<"Fehler!"<<endl;          
    }
    else
    {
       while(inst < instnr+1)
       {
          anford>>inst>>pnr;
          anford.ignore(10,'\n');
          
          if(inst == instnr)
          {
             i++;
             if(pnr == 1)
             {
                // Anzahl Features festlegen
                j++;    
             }
          }
          k++;              
       }
       anzfeat = j;
       anzprod = i/j;  
            
    }
    anford.close();

    int** rpf;
    rpf=new int*[anzprod];
    
    for(int i = 0; i < anzprod; i++)
    {
    rpf[i] = new int[anzprod];
    }

    /*anford.open ("anfsmall.txt");
    
    if(!anford)
    {
       cout<<"Fehler!"<<endl;          
    }
    else
    {
    while(inst < instnr+1)
    {
       anford>>inst>>pnr>>fnr>>val;
       if(inst == instnr)
       {  
          //cout<<"Instanz: "<<inst<<", PNR: "<<pnr<<", FNR: "<<fnr<<", Value: "<<val<<endl;
          if(j <= anzfeat-1)
          {
             rpf[z][j] = val;
             j++;
          }
          else
          {
             z++;
             j = 0;
             rpf[z][j] = val;
             j++;
          }
       }
       inst++;
    }*/


    printarray(rpf,anzprod,anzfeat);
    getchar();
    system("PAUSE");
    return 0;
}



sobald ich es komplett durchlaufen lasse, kommt eben dieser Fehler. Ich könnte mir auch vorstellen, dass es an der Größe der Datei liegt!?

Dieser Post wurde am 22.06.2010 um 14:29 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.06.2010, 14:49 Uhr
Lenja



Ich habe es mit deinem Vorschlag hinbekommen!

Dankeschön!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.06.2010, 10:44 Uhr
Lenja



Hallo,

ich habe doch noch ein kleines Problem.
Wie mach ich es denn, wenn ich double-Werte aus der Datei auslesen möchte?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.06.2010, 11:31 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ganz genauso, nur statt int halt double

wichtig hierbei ist nur: double-werte musst du wie gewohnt mit "." und nicht mit "," schreiben
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.06.2010, 13:16 Uhr
Lenja



Das funktioniert soweit mit dem Einlesen, aber wenn ich die Werte dann mittels [][]-Notation ausgeben möchte, gibt er mir nur ganzzahlige Werte aus und rechnet auch nur damit
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.06.2010, 13:34 Uhr
Lenja



ok, nach ewigem Suchen hab ich das Problem jetzt doch selbst beseitigen können
 
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: