Stream Problem



  • #include <iostream>
    #include <istream> 
    #include <fstream> 
    #include <limits>  
    #include <string>
    
     struct MD  // string für datum und doubles für  die werte in zahlen
    { 
       static std::string datum; 
        static double hours_worked; 
        static double filescreated; 
    };
    
    namespace 
    { 
        const std::streamsize ALL = std::numeric_limits< std::streamsize >::max(); 
    }; 
    // filter :P
    std::istream& operator>>( std::istream& in, MD& md ) 
    { 
        in.ignore( ALL, '[' ) >> md.datum; 
        std::string token; 
        if( getline( in.ignore( ALL, '|' ), token, '=' ) ) 
        { 
            md.hours_worked = 0.;  
            md.filescreated = 0.; 
            if( token == "hours_worked" ) 
                in >> md.hours_worked; 
            else if( token == "filescreated" ) 
                in >> md.filescreated; 
            else 
                in.setstate( std::ios_base::failbit ); 
        } 
        return in; 
    }
    struct Komma : public std::numpunct< char > 
    { 
    protected: 
        virtual char_type do_decimal_point() const 
        { 
            return ','; 
        } 
    };
    
    int main() 
    { 
        using namespace std; 
        ifstream fin ("C:/Ruby193/1.txt"); 
       fin.imbue( locale( fin.getloc(), new Komma ) );
        if( !fin.is_open() ) 
        { 
            cerr << "Fehler beim Oeffnen der Datei" << endl; 
    
            return -2; 
        } 
    
        for( MD md; fin >>  md ; ) 
        {  
               // md's   auswerten
               cout << "Datum        |Stunden gearbeitet | Dateien erstellt " << endl ;
              cout << md.datum << "|          " << md.hours_worked << "                |          " << md.filescreated << endl ;    
    
             // md's summierne
    
        } 
        if( fin.eof() ) 
        { 
    
           } 
    
              //md's schreiben 
              ofstream myFile;  
           myFile.open ("C:/Ruby193/md5.csv");
    
           if (myFile)
       {
    
              myFile << "Datum        |   Stunden gearbeitet | Dateien erstellt " << endl ;
              myFile << md.datum << "|          " << md.hours_worked << "                       |             " << md.filescreated << endl ; 
           myFile.close();
    
            }
    
        getchar () ;
        return 0; 
    }
    

    Hallo um nochmal auf SeppJ antwort zu kommen

    Das md in Zeile 58 hat nur innerhalb der Schleife Gültigkeit.

    Wie kann ich in diesem code den gültigkeitsbereich erweitern damit der so ausführbar ist ?


  • Mod

    Cevin19994 schrieb:

    Wie kann ich in diesem code den gültigkeitsbereich erweitern damit der so ausführbar ist ?

    SeppJ schrieb:

    Das ist zwar nicht die Lösung, aber warum sollte das nicht gehen? Klar geht das!

    Das ist genau das, was ich befürchtet habe. Du hast keinerlei Ahnung, was dieser Code zu bedeuten hat, wie er funktioniert oder was Werner sich dabei gedacht hat. Technisch korrekte Antwort (die beste Art von korrekt): Zieh das MD md; vor die for-Schleife.

    Hilfreiche Antwort ist die gleiche wie bisher: Lern endlich die Grundlagen von C++! Lern die Grundlagen der Programmierung allgemein! Lern an einfacheren Beispielen! So wird das nie etwas werden, außer irgendjemand erbarmt sich endlich mal zur Komplettlösung - die du dann auch nicht verstehen wirst. Wenn du nicht schon eine Woche an diesem Programm verschwendet hättest, wärst du in einem Grundlagenbuch längst bei Gültigkeitsbereichen und grundlegenden Programmstrukturen angelangt.



  • MD md ;
        for(  fin >>  md ; )
    

    So ?
    Das habe ich schon versucht ...


  • Mod

    Die Syntax einer for-Schleife sollte man vielleicht auch können, wenn man komplizierte Programme verändern möchte 🙄 . Das ist zweites oder drittes Kapitel im Grundlagenbuch. Stell dich nicht so lernfaul! Sonst hast du bald alle Helfer verschreckt. Ich glaube, ich bin sowieso der letzte mit Geduld für deine immer gleichen Fragen.



  • Ich habe 4 bücher von Dirk louis über c++ und das was übder die for schleife oder allgemein über schleifen steht ist nicht viel ..

    MD md ;
        for(  fin >>  md ; )
    

    das es so nicht geht weiß ich !

    aber als fehlermedlung bekomme ich nur das er noch ein ";" vor dem ")" will also

    MD md ;
        for(  fin >>  md ;; )
    

    dann ist das programm fehlerlos aber der linker macht probleme wegen den ganzen md's
    Aber wenn es besser so ist lese ich mir gerne noch das kapitel über die schleifen durch gruß cevin


  • Mod

    Cevin19994 schrieb:

    Ich habe 4 bücher von Dirk louis über c++ und das was übder die for schleife oder allgemein über schleifen steht ist nicht viel ..

    Wenn da nicht einmal Schleifen drin stehen, dann ist das wohl kein gutes Buch. Das ist wie eine Lesefibel ohne den Buchstaben 'A'. Guck mal den zweiten Link in meiner Signatur an.

    MD md ;
        for(  fin >>  md ;; )
    

    Das ist ja noch schlimmer. Das Forum ist kein Ersatz dafür, dass du nicht die Grundlagen lernen willst!



  • SeppJ ich weiß das es nicht gerade schön ist das ich mich so "dumm" anstelle
    aber wenn du mir nicht helfen willst versteh ich das ... wirklich ! aber dann mach mich nicht runter ... nur weil du viel über c++ zu wissen scheinst gibt es dir nicht das recht andere so zu behandeln .. ok ich habe bis jetzt versucht immer in meiner höfflichsten form mit jemanden zu schreiben ... egal was mich an der persohn stört !
    und ja ich weiß das es mit dem doppel ";;" auch nicht besser ist
    nur im synax der for schleife heißt es das bei den typischen fehlern es dau kommt das so welche ";" vergessen werden ... die initialisierung und die bedingung werden mit einem ";" abgeschlossen und die reinitialisierung ohne ";"
    Deshalb hab ichs halt mal ausprobiert !



  • Um den Thread mal zu beenden:

    MD md;
    for( ; fin >> md ; )
    {
      // ...
    }
    

    Oder besser gleich

    MD md;
    while (fin >> md)
    {
      // ...
    }
    

    Wenn in deinem C++ Buch wirklich nicht drin steht, wie man for in while Schleifen (und umgekehrt) überführen kann, dann würde es mich schon sehr wundern.



  • Wow Danke doch sowas in der art stand da drin 🙂 jetzt kann ich die md's auch aus der schleife benutzen 🙂
    aber er schreibt immeroch nicht die kompltten daten (die er aus der console aber geben kann ) in die csv ? warum ?



  • Weil du den Code nicht verstehst.

    Mal ne ganz andere Frage: Wenn du Ruby auf deinem Rechner hast, warum willst du dann C++ für diese Aufgabe benutzen? Ruby ist deutlich geeigneter.


  • Mod

    Cevin19994 schrieb:

    aber er schreibt immeroch nicht die kompltten daten (die er aus der console aber geben kann ) in die csv ? warum ?

    Zum dritten und letzten Mal:

    SeppJ schrieb:

    Das ist zwar nicht die Lösung,

    Das war nicht das was du suchtest, weil das Programm ganz was anderes macht, als du denkst. Die Antwort war deher nur technisch korrekt, nicht hilfreich.



  • Michael E. schrieb:

    Weil du den Code nicht verstehst.

    Mal ne ganz andere Frage: Wenn du Ruby auf deinem Rechner hast, warum willst du dann C++ für diese Aufgabe benutzen? Ruby ist deutlich geeigneter.

    Ich habe mit c++ schon viele einfache konsolen anwendungen gemacht
    da dachte ich währe es vom vorteil wenn ich für diese aufgabe auch c++ nehme da ich von ruby garkeine ahnung habe

    das ruby geeigneter ist wusste ich daher habe ich mich mal dran versucht
    aber wenn man englisch nicht beherrscht ist das lernen ohne deutsche bücher noch einmal ne nummer schwieriger
    und von c++ hab ich mehr als genug lern material ( was sich jetzt blöd anhört weil ich dafür mehr als genug fragen habe 😮 )

    Das war nicht das was du suchtest, weil das Programm ganz was anderes macht, als du denkst. Die Antwort war deher nur technisch korrekt, nicht hilfreich.

    Ok dann wenn ich es nicht weiß ... dann sag du mir ... was macht das programm ?


  • Mod

    Cevin19994 schrieb:

    Ok dann wenn ich es nicht weiß ... dann sag du mir ... was macht das programm ?

    Tut mir leid, aber ich habe die Geduld mit dir verloren.



  • SeppJ schrieb:

    Cevin19994 schrieb:

    Ok dann wenn ich es nicht weiß ... dann sag du mir ... was macht das programm ?

    Tut mir leid, aber ich habe die Geduld mit dir verloren.

    ähm ja ich hab dir schon 2 mal gesagt wenn ich dir es nicht recht machen kann dann lass es mir zu helfen ....


  • Mod

    Cevin19994 schrieb:

    ähm ja ich hab dir schon 2 mal gesagt wenn ich dir es nicht recht machen kann dann lass es mir zu helfen ....

    Tue ich ja auch nicht mehr. Wollte dich nur informieren, damit du dich nicht wunderst, wieso ich deine direkte Frage nicht beantworte.



  • 😃 Das ar ich von dir sowieso schon gewohnt 😛



  • Cevin19994 schrieb:

    Ich habe mit c++ schon viele einfache konsolen anwendungen gemacht
    da dachte ich währe es vom vorteil wenn ich für diese aufgabe auch c++ nehme da ich von ruby garkeine ahnung habe

    Nichts für ungut, aber wenn du nicht mal die Syntax einer for-Schleife beherrschst, kann es um deine C++-Kenntnissen auch nicht viel besser stehen.

    das ruby geeigneter ist wusste ich daher habe ich mich mal dran versucht
    aber wenn man englisch nicht beherrscht ist das lernen ohne deutsche bücher noch einmal ne nummer schwieriger

    Man braucht keine Supidupi-Englischkenntnisse, um ein Programmierbuch verstehen zu können. Außerdem gibt es Ruby-Literatur auf Deutsch, sogar kostenlos. Ohne übertreiben zu wollen, kann man dein Problem in fünf Zeilen lösen.



  • Ja ich weiß ... ich hab wohl etwas gelogen damit keine fragen kommen ... in ruby hab ich das ganze schon gelöst ... ich will es aber auch gerne in c++ haben um eben mehr zu lernen ... und bitte erzählt mir nicht das man so nicht lernt ... jeder hat seine eigene art zu lernen ...
    so hab ich es in ruby gelöst .... dürfte ich den die 5 magischen zeilen zum lösen meines problem haben ?

    #!/usr/bin/env ruby
    # encoding: utf-8
    
    require 'rubygems'
    require 'csv'
    require 'bundler'
    Bundler.require(:default)
    
    module CommandLineFlags extend OptiFlagSet
      # (port: 55672) # http://localhost:55672/#/
      optional_flag "folder"
      optional_flag "output"
    
      and_process!
    end 
    
    folder = ARGV.flags.folder || Dir.pwd
    output = ARGV.flags.output || "#{Time.now}_output.csv"
    
    puts "Value extractor"
    puts "============================="
    puts "Output file: '#{output}'"
    puts "============================="
    
    def get_md_files(path)
      files = []
      Dir.foreach(path) do |entry|
        next if (entry == '..' || entry == '.')
        full_path = File.join(path, entry)
        if File.directory?(full_path)
          files += get_md_files(full_path)
        else
          files << full_path if ".md" == File.extname(entry)
        end
      end
      return files
    end
    
    def extract_values(files)
      keys = []
      grid = {}
    
      prefilter = /[(.*)]/
      scanvalue = /([0-9]{4}-[0-9]{2}-[0-9]{2}).*\|(\w*)=([\w,.]*)/
    
      files.each do |path|
        content = File.read(path)
        content.scan(prefilter) { |bracket| 
          #ap bracket.to_s
          bracket.to_s.scan(scanvalue) { |date,key,value| 
            # normalize that german numbers
            #date = Date.parse date
            #date = date.strftime("%Y-%m-%d")
            value = value.gsub(',', '.').to_f
            #ap "date: #{date}, key: #{key}, value: #{value}" 
    
            # sort the values
            keys.push(key).uniq!
            grid[date] = {} if grid[date].nil?
            grid[date][key] = 0 if grid[date][key].nil?
            grid[date][key] += value
    
            puts "date: #{date}, key: #{key}, value: #{value} for #{bracket}" 
            puts "#{date} => #{grid[date]}"
          }
        }
      end
        puts "================"
      ap grid
      ap keys
    
      return keys, grid
    end
    
    def write_csv(keys, grid, output)
       header = ["date"]
       keys.each do |key|
         header << key
       end
    
       CSV.open(output, "wb") do |csv|
         csv << header
    
         grid.each do |date, values|
           row = [date]
    
           keys.each do |key|
             puts "grid: #{grid[date][key]}"
             row << grid[date][key] || ''
           end
    
           ap row
           csv << row
         end
       end
    end
    
    # Structure
    # =========
    
    # Get all .md files from tree
    files = get_md_files(folder)
    
    # parse every file in the list for the pattern [2012-10-04 17:14|key=2]
      # put the keys into an array
      # put and aggregate the files into a nested hashmap
    keys,grid = extract_values(files)
    
      puts " WRITE CSV ================"
    # output all the hashmap into a csv
    write_csv(keys, grid, output)
    


  • Cevin19994 schrieb:

    ich hab wohl etwas gelogen damit keine fragen kommen ...

    Beste Voraussetzungen für Hilfe.

    in ruby hab ich das ganze schon gelöst ...

    Das kaufe ich dir beim besten Willen nicht ab.



  • Das mit dem lügen tut mir ja leid aber ich musste leider feststellen das der ton nicht immer freundlich ist hier ...

    ob du es mir ankaufst oder nicht ist gerne die überlassen
    das war mal eine aufgabe die ich machen musste um ein Praktikum in einer firma zu bekommen ... naklar hatte ich da auch hilfe ...
    nur jetzt versuche ich das in c++ umzusetzten


Anmelden zum Antworten