Einlesen einzelner Ziffern



  • Naja, die Ausgabe ist total falsch, zumindest nicht so wie ich es mir vorstelle...
    Bspw.
    810000
    810900
    811800
    812700

    gibt er iwie sowas aus:
    810000

    81090
    081180
    081180
    3
    081270

    Ok, mit dem Array werd' ich's mal versuchen.

    Ja, mit fstream hatte ich es zuerst auch versucht, aber da bin ich iwie nicht mit zurecht gekommen. Die Erklärungen dazu, die ich im Netz fand, hatten mir nicht gereicht...



  • Sind die Leerzeichen zwischen den %cs nicht falsch? Bin mir nicht sicher, hab nie printf oder scanf genutzt.



  • Wenn ich's so mache, dann gibt der mir nur die erste Zahl aus...-.-

    int i;
    	for(i=0;i<10000;i++){
    		fscanf(file,"%c %c %c %c %c %c", &A[0],&A[1],&A[2],&A[3],&A[4],&A[5]);
    		cout<< A;
    
    	}
    

    ok, wenn ich noch <<endl hinzufüge, gibt er mir mehr aus, aber wieder nicht exakt die Zahlen:
    810000

    81090
    081180
    081270
    081360
    081450
    081540
    ...
    beim ersten Mal schreibt er die Zeichen richtig ins Array, beim zweiten Mal aber nicht...man..



  • Slabic schrieb:

    Ja, mit fstream hatte ich es zuerst auch versucht, aber da bin ich iwie nicht mit zurecht gekommen. Die Erklärungen dazu, die ich im Netz fand, hatten mir nicht gereicht...

    Naja aber dann gleich die Sprache wechseln? (C++ -> C) Hättest lieber mit deinen fstream-Problemen hier nachfragen können 😉

    Versuch doch nochmal die C-Altlasten loszuwerden (mit denen es ja offenbar ebenfalls nciht so recht klappt), dann kann dir hier vermutlich auch besser geholfen werden (für scanf() wäre eher das ANSI-C-Forum der richtige Ort)



  • pumuckl schrieb:

    Slabic schrieb:

    Ja, mit fstream hatte ich es zuerst auch versucht, aber da bin ich iwie nicht mit zurecht gekommen. Die Erklärungen dazu, die ich im Netz fand, hatten mir nicht gereicht...

    Naja aber dann gleich die Sprache wechseln? (C++ -> C) Hättest lieber mit deinen fstream-Problemen hier nachfragen können 😉

    Naja, C ist auch C++. ^^
    Außerdem war ich noch nicht angemeldet, als ich fstream versucht hatte.
    Aber, nagut, dann werde ich das ganze Mal mit fstream versuchen.



  • Zum Einlesen einer Zeile finde ich nur getline().
    Aber ich weiß nicht, wie ich das jetzt genau verwende... 😞

    Könnte mir das bitte jemand etwas genauer erklären.
    Ich schlag mich seit gestern mit diesem verdammten Einlesen rum und langsam geht mir das ganze ziemlich auf die Nerven 😡 😡


  • Administrator

    Slabic schrieb:

    Naja, C ist auch C++. ^^

    Du meinst wohl eher, dass Teile von C in C++ enthalten sind. Die beiden Sprachen sind nicht 100% kompatibel. C++ Code lässt sich zudem auf einem C Kompiler gar nicht kompilieren 😉

    Dokumentation zu den IO Streams in C++:
    http://www.cplusplus.com/reference/iostream/

    Dokumentation zu std::getline:
    http://www.cplusplus.com/reference/string/

    Grüssli



  • Ja, auf diese von dir genannten Seiten stoße ich andauernd und sie stressen mich viel mehr, als dass sie mir helfen.



  • Slabic schrieb:

    Ja, auf diese von dir genannten Seiten stoße ich andauernd und sie stressen mich viel mehr, als dass sie mir helfen.

    Bei getline habe ich dabei Probleme damit, zu verstehen, was wie genau der String ist und wie, wo, was aus der Datei gespeichert wird und wie ich den String, in dem meine Daten dann sind, genau verwende....

    schon mal versucht, nen C++ Buch zu kaufen?
    ich kanns dir zwar hier hinschreiben, aber das wird dir nix nützen:

    #include <fstream>  //std::fstream
    #include <string>   //std::string
    #include <iostream> //std::cin + std::cout + std::endl
    #include <vector>   //std::vector
    #include <stdexcept>//std::invalid_argument
    
    int main()
    {
      std::string dateiname;
      std::cout << "dateiname eingeben" << std::endl;
      std::getline (std::cin, dateiname);
      std::fstream stream (dateiname);
      std::vector <int> zahlen;
      for(char tmp; stream >> tmp; )
      {
        int toAdd = tmp-'0';
        if ((toAdd > 9) || (toAdd < 0))
          throw std::invalid_argument ("keine ziffer");
        zahlen.push_back (toAdd);
      }
    
      for (std::vector<int>::const_iterator i(zahlen.begin()), e(zahlen.end()); i != e; ++i)
        std::cout << *i;
    
      std::cout << std::endl;
    }
    

    bb



  • zeig uns mal deinen Code und wie der Dateininhalt aussieht den du hast. Ich persönlich probiere immer gern aus wenn ich nicht 100%ig weiß was eine Funktion genau ergibt. Hast du mit getline() schon etwas rumgespielt? (btw, es gibt auch noch den operator>> um etwas aus einem Stream zu bekommen).

    Ich verstehe auch deine Ungeduld, du möchtest dein Programm zum Laufen bringen und es hapert "nur" am Einlesen. Jetzt Zeit zu investieren ist nervig - aber es lohnt sich, schließlich lernst du dabei was was du auch später noch öfters brauchen wirst 😉



  • @unskilled
    danke, aber in der Tat bringt's nicht soviel ^^

    JIPPIE, hab's jetzt endlich hingekriegt!!

    Man,man...ja, echt ärgerlich wenn das einlesen einen so lange aufhält ^^
    Naja, danke an alle.
    Werde demnächst sicherlich desöfteren hier fragen stellen. ^^



  • Slabic schrieb:

    Ja, auf diese von dir genannten Seiten stoße ich andauernd und sie stressen mich viel mehr, als dass sie mir helfen.

    Die sind aber sehr nützlich. www.cplusplus.com ist ein gutes Nachschlagewerk, was die C++-Standardbibliothek betrifft. Du solltest dir die Zeit nehmen, die Artikel zu den verwendeten Klassen und Funktionen zu lesen... 😉



  • Dravere schrieb:

    C++ Code lässt sich zudem auf einem C Kompiler gar nicht kompilieren 😉

    Doch, wenn er nur aus C übernommene Funktionen benutzt, dann schon! :p 😉 (bis auf wenige Ausnahmen natürlich...)



  • Noch eine kleine Frage.
    Dazu find' ich in der C++-reference irgendwie nichts.

    Wie kann ich einzelne Ziffern einer großen Zahl einlesen und in eine int-Variable speichern?

    In der Reference wird immer nur ein Char eingelesen...



  • Musst du die Ziffern einzeln einlesen? Wenn nicht, kannst du den operator>> auch für int benutzen, um gleich ganze Zahlen einzulesen. Falls doch, wäre std::istream::get() vielleicht was.



  • Naja, ich will die Summe aller Ziffern der Zahl 2^1000 bestimmen.

    Get und Getline, wollen ein Char. Das ist mein Problem.



  • Das Problem besteht noch.
    Würde mich über jede Hilfe freuen.



  • Slabic schrieb:

    Naja, ich will die Summe aller Ziffern der Zahl 2^1000 bestimmen.

    ähm. nee.
    die quersumme von 2^1000 ist ein programmiertechnisches problem, das du erst in ca einem halben jahr angehen solltest.

    der weg ist wohl:
    baue eine klasse BigUInt, die intern ein char-array hat und als lange zahl denkt. baue eine methode verdoppeln, die halbschriftlich mit 2 multipliziert. rufe die funktion 1000-mal auf. baue eine funktion quersumme, die über das char-array läuft. und gib das aus. kannst die klassenkacke auch weglassen und char[10000] nehmen, weil du mathematisch abschätzen kannst, daß der platz reicht.



  • Ok, so in etwa hatte ich mir das gedacht.
    Aber, die Zahl habe ich mir schon von Mathematica bestimmen lassen.
    Jetzt bräuchte ich nur noch das Ziffernweise einlesen...^^



  • Slabic schrieb:

    Ok, so in etwa hatte ich mir das gedacht.
    Aber, die Zahl habe ich mir schon von Mathematica bestimmen lassen.
    Jetzt bräuchte ich nur noch das Ziffernweise einlesen...^^

    das geht dann ganz schnell.

    int summe=0;
    ifstream in("zahl.txt");
    char ch;
    while(in>>ch)
      summe+=(ch-'0')
    return summe;
    

    edit: noch testen, ob Mathematica \n\r oder sowas dranbaut mit 2^10==1024. wenns damit klappt und Mathematica keine zeilenumbrüche einfügt, sollte es klappen.
    teste zusätzlich das ergebnis nochmal, indem du die letze ziffer prüfst, also

    int x=1;
    for(int i=1;i<1000;++i)
       x=x*2%10;
    

    wenn die auch stimmt, sollte alles ok sein.


Anmelden zum Antworten