tutorials.de Buch-Aktion 05/2012
Like Tree5Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von Crash Kid
  • 1 Beitrag von deepthroat
  • 1 Beitrag von deepthroat
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
267
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    cplusbo cplusbo ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    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 :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    
    #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
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi und Willkommen bei tutorials.de

    Es heißt
    infile.getline

    Parameter fehlt auch einer, siehe
    http://www.cplusplus.com/reference/i...tream/getline/

    Gruß
    cplusbo bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    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
    cplusbo bedankt sich. 
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von sheel Beitrag anzeigen
    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:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    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ß
    Geändert von deepthroat (26.10.11 um 20:47 Uhr)
    cplusbo bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    cplusbo cplusbo ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    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.
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von cplusbo Beitrag anzeigen
    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ß
    cplusbo bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    cplusbo cplusbo ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    Code :
    1
    2
    
    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....
    Geändert von sheel (26.10.11 um 21:16 Uhr) Grund: Doppel
     

  8. #8
    cplusbo cplusbo ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    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
     

  9. #9
    cplusbo cplusbo ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    wäre find_first_of und dann (int) eine möglichkeit?
    Code :
    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
    
      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;*/
      }
    Geändert von cplusbo (27.10.11 um 13:22 Uhr)
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    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:
    Code cpp:
    1
    2
    3
    
    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ß
    cplusbo bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    cplusbo cplusbo ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    Danke für Deine Antwort.
    Ich war so glücklich wenigstens irgend etwas heraus zu bekommen
    Aber ich werd es überarbeiten...
    Das mit dem eof ist sogar eine Vorlage vom Vortragenden.

    viele grüße
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von cplusbo Beitrag anzeigen
    Das mit dem eof ist sogar eine Vorlage vom Vortragenden.[/
    Das ist traurig.

    Es gibt leider auch Bücher wo so ein Unsinn drin steht. Ein Kampf gegen Windmühlen...

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Problem mit getline!
    Von peter pan im Forum C/C++
    Antworten: 9
    Letzter Beitrag: 25.01.10, 13:28
  2. Problem bei std::cin.getline
    Von Rene42 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 08.01.10, 10:22
  3. [C++] cin.getline problem
    Von dr_pepper im Forum C/C++
    Antworten: 13
    Letzter Beitrag: 12.04.09, 14:30
  4. Problem mit ifstream()
    Von Bertelcraft im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 28.09.07, 08:33
  5. ifstream::ofstream problem
    Von philishake im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 14.03.06, 10:04