problem mit getline/ifstream

cplusbo

Grünschnabel
Guten Abend zusammen,
Ich bin neu im Forum und neu bei C++.
Ich bitte um Eure Hilfe, ich kann meinen Fehler nicht finden.
Folgende Aufgabenstellung:
Ich muss eine Textfile einlesen, Wörter und Datum sind mit '#' getrennt. die einzelnen Wörter sollen in Arrays der Groesse 100 gespeichert werden. Ausgegeben soll die Datei ohne #-Zeichen werden. Bsp.: hansi#soundso#12 -> hansi soundso 12.

meine derzeitige fehler meldung sagt: no matching function to call for getline....

Code:
#include <iostream>
#include <fstream>    
#include <string>
#include <cstring>
using namespace std;

int main (int argc, char* argv[]) 
{
    
    const int AR_GROESSE = 100;
    string nachnameAR[AR_GROESSE];
    string vornameAR[AR_GROESSE];
    int tagAR[AR_GROESSE];
    int monatAR[AR_GROESSE];
    int jahrAR[AR_GROESSE];
    int indexCount;

  ifstream infile;
  
  for(indexCount = 0; indexCount < 100; indexCount++)
    {
    getline(infile, nachnameAR[indexCount]);
    getline(infile, vornameAR[indexCount]);
    
    infile >> tagAR[indexCount] >> monatAR[indexCount] >> jahrAR[indexCount];
    infile.ignore();
    }
  infile.open("datei.txt"); // oeffnet Textdatei zum Lesen
  int i=0;

  while (!infile.eof()) 
  {   
    getline(infile, nachnameAR[i],'#');
    getline(infile, vornameAR[i],'#');
    getline(infile, tagAR[i],'.');
    getline(infile, monatAR[i],'.');
    getline(infile, jahrAR[i],'.');
    
    }

   // if (infile.eof()) break; 
  
  }
  infile.close();           
  
  for(int j=0; j<i;j++)
  {
          cout << personen_angaben.nachname[j] << " ";
  }
  for(int j=0; j<i;j++)
  {
          cout << personen_angaben.vorname[j] << " ";
  }
  for(int j=0; j < i; j++)
  {
          cout << personen_angaben.tag[j] << ".";
  }
  for(int j=0; j<i; j++)
  {
          cout << personen_angaben.monat[j] << ".";
  }
  for (int j=0; j<i;j++)
  {
      cout << personen_angaben.jahr[j] << endl;
  }
  system("PAUSE");
  return 0;
}

Schönen Abend inzwischen:)
 
Hallo,

also was ich an deinem Code schon mal gesehen habe ist, dass du nach getline, oder vor infile.close(); eine } zuviel hast. Deine main-Funktion wäre schon vor dem infile.close(); wieder geschlossen.

Nun zu deinem Problem, was ich rausgefunden habe ist, dass der Compiler nur an den Stellen reklammiert, wo du den Typ int verwendest. Danach hab ich nach der getline-Funktion gegoogelt und rausgefunden, dass du nur den Typ string verwenden darfst.

Link: http://www.cplusplus.com/reference/string/getline/

Darum bekommst du einen Fehler vom Compiler.


grüße
 
Hi.
Es heißt
infile.getline
Es gibt auch eine (überladene) Funktion getline (neben der getline Methode):

http://www.cplusplus.com/reference/string/getline/
\edit: ach es ist schon spät, hat Crash Kid ja schon verlinkt.. :-( sorry.

\edit2: nun aber zu meinem Lieblingsproblem: eof. Die Schleife funktioniert so nicht verläßlich. Sondern z.B. so:
C++:
while (
    getline(infile, nachnameAR[i],'#') &&
    getline(infile, vornameAR[i],'#') &&
    infile >> tagAR[i] && infile.get() == '.' &&
    infile >> monatAR[i] && infile.get() == '.' &&
    infile >> jahrAR[i])
{
  // tue etwas mit dem Datensatz.
}
Apropos Datensatz. Es wäre schöner, wenn du für den Datensatz eine Struktur definieren würdest und dann ein Array daraus bildest.

Bsp:
C++:
struct datum_t {
  int tag;
  int monat;
  int jahr;
};

struct Datensatz {
  string name;
  string vorname;
  datum_t datum;
}

Datensatz speicher[500];

getline(infile, speicher[i].name, '#') &&
infile >> speicher[i].datum.tag ; // usw.
Gruß
 
Zuletzt bearbeitet:
Vielen Dank für Deine rasche Antwort und für die nette Begrüßung.

Das "infile.getline" hatte ich schon mal ausprobiert.
zur zeit bekomme ich eine sehr verschreckende fehler meldung:( mit no matching call...basic istream...char t... basic traits usw.
 
Hi.
Vielen Dank für Deine rasche Antwort und für die nette Begrüßung.

Das "infile.getline" hatte ich schon mal ausprobiert.
zur zeit bekomme ich eine sehr verschreckende fehler meldung:( mit no matching call...basic istream...char t... basic traits usw.
Bitte poste immer die exakte Fehlermeldung eingefasst in [code]..[/code] Tags. Du kannst die Fehlermeldungen kopieren! Nicht abschreiben!

Gruß
 
Code:
36 C:\Dev-Cpp\Hue\mainprobe4.cpp invalid conversion from `int' to `char*' 
38 C:\Dev-Cpp\Hue\mainprobe4.cpp   initializing argument 1 of `std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'

diese fehlermeldung wiederholt sich immer wieder. das mit "invalid convert" könnte ja mit dem was crashkid geschrieben hat zu tun haben.
vielen dank für Eure antworten, werd jetzt versuchen das programm zum Laufen zu bringen:)

hab grad gesehen, dass der zweite teil nicht mehr dazu passt ("personen_angaben"...), hab das schon geändert.
wir haben struct noch nicht gelernt, deshalb die ganzen umstände....
 
Zuletzt bearbeitet von einem Moderator:
Hallo beisammen,
Hab mein Programm soweite zum laufen gebracht, juhu:))
habs jetzt aber komplett ander gemacht --> die Not macht erfinderisch;)

jetzt muss ich aber noch einmal lästig sein
in der ausgabe steht jetzt : hansi soundso 12.3.1980
ich soll jetzt das datum irgendwie herausbekommen um folgende Ausgabe zu erhalten:
hansi soundso
geboren am 12.3.1980

meine idee ist, dass ich die position vor dem datum finde und dann einfach '\n' und 'geboren am' einfüge.
leider wiess ich nicht, wie man weiss, wann in einem string ein datum anfängt bzw. danach suchen lässt.
vielleicht hat irgendjm eine idee:)
danke schon mal
 
wäre find_first_of und dann (int) eine möglichkeit?
Code:
  while (true) 
  {
      
        
    getline (infile, zeile1);
    //getline (infile, zeile2); // liest eine Zeile ein, vgl. Vorlesung 2
    //getline (infile, zeile3);
    
    if (infile.eof()) break; 

   //zeile.replace(zeile.find("#"), char("#").length(), " ");

    infile >> person1;
    //infile >> person2;
    //infile >> person3;
    pos = zeile1.find_last_of("#");  // pos deklariert mit int pos;
    
    replace(zeile1.begin(),zeile1.end(),'#',' '); 
   
    cout << zeile1 << endl;
    /*replace(zeile2.begin(),zeile2.end(),'#',' '); 
    cout << zeile2 << endl;
    replace(zeile3.begin(),zeile3.end(),'#',' '); 
    cout << zeile3 << endl;*/
  }
 
Zuletzt bearbeitet:
Hi.

Nochmal: die Prüfung mit eof funktioniert nicht. Es ist besser (und einfacher) direkt die Operation auf ihr Gelingen zu prüfen und nur dann weiterzuarbeiten wenn auch etwas eingelesen wurde:
C++:
while (getline(infile, zeile)) {
  ...
}
Außerdem denke ich, dass der Versuch, das Format der Zeile zu parsen schon der richtige Ansatz war. Jetzt hast du diesen Schritt vereinfacht, aber bekommst dann Probleme weil du doch wieder die Zeile auseinanderpflücken mußt - was vorher eigentlich ziemlich simpel gewesen wäre (da alles so schön mit # getrennt war).

Außerdem hab ich dir doch schon ein (fast) vollständig funktionstüchtiges Beispiel geschrieben....

Gruß
 
Zurück