tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
15
ZUGRIFFE
1578
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    marina75 marina75 ist offline Grünschnabel
    Registriert seit
    Nov 2009
    Beiträge
    4
    Hallo, für weitere statistische Auswertungen muss ich eine Datei.txt in C++ einlesen. Datei besteht aus eine Spalte mit Zahlen, die ich gerne als Vektor weiter benutzen will. Kann mir jemand helfen
    Danke
    Marina
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Willkommen im Forum!

    Zeig mal den Quelltext, sonst können wir nur raten...
     

  3. #3
    marina75 marina75 ist offline Grünschnabel
    Registriert seit
    Nov 2009
    Beiträge
    4
    Hallo, das ist der Queltest:
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    2
    usw. bis 24, n=602, das sind die Häufigkeiten.
    ich habe mit diesen C++ code versucht, aber bekomme nur ein Sting, kein Vektor.


    #include <iostream>
    #include <fstream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    //"C:\\Dokumente und Einstellungen\\Admin\\Desktop\\thai_p.txt";
    using namespace std;
    int main() {
    ifstream dat_ein;
    string dateiname=("C:\\Dokumente und Einstellungen\\Admin\\Desktop\\thai_p.txt");
    dat_ein.open (dateiname.c_str(), ios_base::in);
    if (!dat_ein)
    { cout <<"nicht";
    cout<<endl;
    return -1;
    }
    char a[602];
    char count;
    int i;
    int j;
    while(dat_ein.get(count))
    { a[i]=count;
    i++;
    for (j=1; j<=i; j++)
    {
    cout<<a[j];
    cin.get();
    }
    return 0;
    }
    }
     

  4. #4
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.358
    Blog-Einträge
    4
    Hallo Marina,

    also bei mir kann dein Quelltext zwar kompiliert und ausgeführt werden, aber dann
    kommt die Meldung "datei.exe funktionert nicht mehr" (habe Vista).

    bei datei_ein.open brauchst du kein ios::in mehr. Du hast ja ifstream benutzt.
    Die Funktion get(char &r) schreibt den Wert in r. Du musst eine Referenz angeben.

    Den Sinn von i und j verstehte ich irgendwie nicht. Wieso gibts du es nicht gleich aus
    und wartest auf Tastendruck?

    Code :
    1
    
    cout << a[i];  cin.get();

    Eigentlich ist char a[602] kein Vektor, sonder das:

    std::vector<int> v;

    Siehe hier
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  5. #5
    marina75 marina75 ist offline Grünschnabel
    Registriert seit
    Nov 2009
    Beiträge
    4
    Danke für Hilfe
    Ist dass richtig Leider ich habe mathe und statistik studiert... Bin kein Profi in C++.....

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    #include <vector>
    //"C:\\Users\\Marina\\Desktop\\thai_p.txt";
    using namespace std;
    int main() {
    ifstream dat_ein;
    string dateiname=("C:\\Dokumente und Einstellungen\\Admin\\Desktop\\thai_p.txt");
    dat_ein.open (dateiname.c_str());
    if (!dat_ein)
    { cout <<"nicht";
    cout<<endl;
    return -1;
    }
    std::vector<int> a;
    int i;

    for (i=0; i<100; ++i) {
    a.push_back(i);
    ++a[i];
    }

    char count;
    int i;
    int j;
    while(dat_ein.get(count&a))
    { a[i]=count;
    i++;

    cout<<a[i];
    cin.get();
    return 0;
    }
    }
     

  6. #6
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Hi!

    Ohne Dich kränken zu wollen... Der Code ergibt keinen Sinn - mal davon abgesehen dass ich keinen Compiler kenne der Ihn akzeptieren würde.
    Da ich zu faul bin die Fehler auseinander zu nehmen poste ich hier einfach mal eine mögliche Lösung der Aufgabe so wie ich sie verstanden habe. Wenn dabei das für Dich richtige Ergebnis herauskommt, füge ich gern noch eine detaillierte Erklärung hinzu...
    Code C++:
    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
    
    #include <iostream>
    #include <fstream>
    #include <vector>
     
    using namespace std;
     
    int
    main(int argc, const char *argv[])
    {
        int i;
        vector<int> vektor(100, 0);
        istream *datei = NULL;
     
        if(argc < 2)
        {
            datei = &cin;
        }
        else
        {
            datei = new ifstream(argv[1]);
     
            if(!*datei)
            {
                cerr << argv[1] << " kann nicht gelesen werden!" << endl;
                delete datei;
                return -1;
            }
        }
     
        while(!datei->eof())
        {
            *datei >> skipws >> i;
     
            if(i < 0 || i > 100)
            {
                cerr << "Ein Wert wie " << i << " wurde nicht berücksichtigt." << endl;
                continue;
            }
     
            ++vektor[i];
        }
     
        for(i=0; i!=100; ++i)
        {
            cout << i << " => " << vektor[i] << endl;
        }
     
        if(argc > 1)
        {
            delete datei;
        }
     
        return 0;
    }
    Anwengungsbeispiele:
    Code :
    1
    2
    
    C:\> programmname < C:\Users\Marina\Desktop\thai_p.txt > ergebnis.txt
    C:\> programmname C:\Users\Marina\Desktop\thai_p.txt > ergebnis.txt
    Anbei noch die Datei mit der ich das ganze getestet habe und das Ergebnis.

    Gruß
    Enum

    PS: Bitte benutze in Zukunft die Blöcke zum Code hervorheben - aus Rücksicht auf diejenigen welche versuchen den Code zu lesen..
    Angehängte Dateien Angehängte Dateien
    Geändert von Enumerator (08.11.09 um 22:15 Uhr) Grund: Ergänzungen
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  7. #7
    marina75 marina75 ist offline Grünschnabel
    Registriert seit
    Nov 2009
    Beiträge
    4
    Hallo, vielen Dank für Hilfe!! Super...bin vielleicht zu dumm dafür.... wo soll ich den Pfad für meine Textdatei reinschreiben.... ? (
     

  8. #8
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Hi!

    Zitat Zitat von marina75 Beitrag anzeigen
    wo soll ich den Pfad für meine Textdatei reinschreiben.... ? (
    Gar nicht. Der wird als Parameter beim Aufruf des Programms übergeben. Alles andere würde bedeuten, dass Du das Programm neu kompilieren musst sobald sich der Pfad und/oder der Dateiname ändert.
    Wie im vorherigen Post schon demonstriert, kannst Du das Programm über die Eingabeaufforderung starten.
    Um in die Eingabeaufforderung zu gelangen musst Du unter Windows entweder im Startmenü unter "Zubehör" den Punkt ("MS-DOS-")"Eingabeaufforderung" wählen oder im Startmenü auf "Ausführen" klicken und "cmd" eingeben. Am schnellsten geht es aber, wenn Du die Windows-Taste und <R> gleichzeitig drückst und dann "cmd" eingibst.
    In der Eingabeaufforderung wechselst Du mit dem cd-Befehl ("ChangeDirectory") in das Verzeichnis in dem das fertige Programm liegt:
    Code :
    1
    2
    
    C:\Da\Bin\Ich> cd C:\Da\Ist\Das\Programm
    C:\Da\Ist\Das\Programm>
    Jetzt tippst Du einfach den Programmnamen und dann den Pfad zu der Datei:
    Code :
    1
    
    C:\Da\Ist\Das\Programm> progname C:\Users\Marina\Desktop\thai_p.txt
    Und dann geht's los. Im Moment schreibt das Programm einfach die Ergebnisse "auf den Bildschirm", also in das Fentser der Eingabeaufforderung. Wenn Du diese Ausgabe in einer Datei haben möchtest..:
    Code :
    1
    
    C:\Da\Ist\Das\Programm> progname C:\Users\Marina\Desktop\thai_p.txt > C:\Da\Sollen\Die\Ergebnisse\hin.txt


    Willst Du den Vorgang mit dem Getippe abkürzen und z.B. einfach auf dem Desktop ein Symbol haben zum klicken, dann erstellst Du im Ordner C:\Users\Marina\Desktop eine Datei names berechnen.bat (wobei der Name vor dem Punkt natürlich egal ist) und schreibst da das Folgende rein:
    Code :
    1
    
    C:\Da\Ist\Das\Programm\progname C:\Users\Marina\Desktop\thai_p.txt > C:\Da\Sollen\Die\Ergebnisse\hin.txt


    Soviel zum Thema. Wenn Du aber auf der unsauberen Lösung mit dem einkompilierten Pfad bestehst, bitteschön:
    Code C++:
    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
    
    #include <iostream>
    #include <fstream>
    #include <vector>
     
    #define DATEINAME "C:\Users\Marina\Desktop\thai_p.txt"
     
    using namespace std;
     
    int
    main()
    {
        int i;
        vector<int> vektor(100, 0);
        istream datei(DATEINAME);
     
        if(!datei)
        {
            cerr << "Konnte " << DATEINAME << " nicht öffnen!" << endl;
            return -1;
        }
     
        while(!datei.eof())
        {
            datei >> skipws >> i;
     
            if(i < 0 || i > 100)
            {
                cerr << "Ein Wert wie " << i << " wurde nicht berücksichtigt." << endl;
                continue;
            }
     
            ++vektor[i];
        }
     
        datei.close();
     
        for(i=0; i!=100; ++i)
        {
            cout << i << " => " << vektor[i] << endl;
        }
     
        return 0;
    }

    Gruß
    Enum
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Enumerator Beitrag anzeigen
    Code C++:
    1
    2
    3
    4
    5
    
        while(!datei.eof())
        {
            datei >> skipws >> i;
            ...
        }
    Bitte bring doch nicht Anfängern diesen Unsinn bei. Sorry, aber wieso machen das alle falsch? Bin es eigentlich leid das jeden Monat wieder hier so zu sehen...
    Code cpp:
    1
    2
    3
    
    while (datei >> i) {
        ...
    }
    Wozu rufst du skipws auf? Erstens ist es die Standardeinstellung, zweitens wirkt sich diese Einstellung grundsätzlich nur aus wenn du Strings einliest.

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

  10. #10
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    @deepthroat:
    Ok, bei skipws lass' ich mich gern korrigieren. Allerdings unterschlägt while(datei >> i) den letzten Eintrag...
    Sicher, es gibt elegantere Lösungen als den zusätzlichen Funktionsaufruf in meinem Beispiel... nur ob die dann auch einfacher sind?
    Geändert von Enumerator (10.11.09 um 15:06 Uhr)
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Enumerator Beitrag anzeigen
    Allerdings unterschlägt while(datei >> i) den letzten Eintrag...
    Sicher, es gibt elegantere Lösungen als den zusätzlichen Funktionsaufruf in meinem Beispiel... nur ob die dann auch einfacher sind?
    Es geht nicht um die Einfachheit (wobei das noch dazukommt). Dein Code ist einfach falsch und funktioniert nicht [verlässlich].

    Und du irrst dich: mein Code unterschlägt nicht den letzten Eintrag. Im Gegenteil: bei deinem Code besteht diese Möglichkeit. (\edit: evlt. kommst du auch zu dieser Fehleinschätzung, da dein Code die letzte Zeile doppelt verarbeitet?)

    Gruß
    Geändert von deepthroat (10.11.09 um 15:41 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  12. #12
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Tatsache!
    Gibt es hier einen Smiley der sich verbeugt?
    ... nein, aber den hier:
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  13. #13
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Enumerator Beitrag anzeigen
    Tatsache!
    Gibt es hier einen Smiley der sich verbeugt?
    ... nein, aber den hier:
    Verbeugung angenommen

    Aber wie kommst du denn darauf die eof() Methode aufzurufen? Es ist doch komplizierter und weniger überschaubar als die "normale" Vorgehensweise?

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

  14. #14
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Ich verwende meist C und dachte einfach an die Überprüfung des Rückgabewertes von fscanf auf EOF.
    Wobei ich ja auch hätte Nachsehen können..,
    - was der Rightshift-Operator bei ifstream-Objekten wann zurück gibt,
    - dabei feststellen, dass laut der Doku immer *this zurückgegeben wird und
    - mich dann fragen, ob da vielleicht auch mal NULL 'rauskommen kann und die Doku einfach unvollständig ist oder
    - ob ein entsprechender Operator auf istream-Pointer irgenwdo definiert wird.
    Da ich das jetzt nachgeholt habe und nun vor der Frage stehe, will ich genau diese mal stellen - bevor ich mir die Mühe mache es heraus zu finden:
    Warum funktioniert while(datei >> i) so vorbildlich?
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  15. #15
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Enumerator Beitrag anzeigen
    Ich verwende meist C und dachte einfach an die Überprüfung des Rückgabewertes von fscanf auf EOF.
    Aha. Aber du rufst ja auch nicht vor der Eingabe feof() auf, denn dann weißt du auch wieder nicht ob das folgende Einlesen klappen wird. Du führst doch auch eine Einleseoperation durch und prüfst dann ob diese erfolgreich war. Und auf EOF prüft man auch da in den seltensten Fällen.
    Zitat Zitat von Enumerator Beitrag anzeigen
    Wobei ich ja auch hätte Nachsehen können..,
    - was der Rightshift-Operator bei ifstream-Objekten wann zurück gibt,
    - dabei feststellen, dass laut der Doku immer *this zurückgegeben wird und
    - mich dann fragen, ob da vielleicht auch mal NULL 'rauskommen kann und die Doku einfach unvollständig ist oder
    - ob ein entsprechender Operator auf istream-Pointer irgenwdo definiert wird.
    Da ich das jetzt nachgeholt habe und nun vor der Frage stehe, will ich genau diese mal stellen - bevor ich mir die Mühe mache es heraus zu finden:
    Warum funktioniert while(datei >> i) so vorbildlich?
    Weil ein operator void*() auf den Streams definiert ist, der einen Nullzeigerwert zurückgibt falls eof(), bad() oder fail() true zurückliefern, der Stream also in einem der drei Fehlerzustände ist. Ein void* kann in einen boolschen Wert konvertiert werden.

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

Ähnliche Themen

  1. PL/SQL Datei einlesen
    Von zuckerbrini im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 16.02.09, 10:36
  2. CSV-Datei einlesen
    Von WIK-Lars im Forum PHP
    Antworten: 4
    Letzter Beitrag: 03.07.07, 17:39
  3. Datei auswählen, Datei einlesen
    Von -TS- im Forum Visual Basic 6.0
    Antworten: 4
    Letzter Beitrag: 21.04.05, 21:08
  4. Datei einlesen in Batch- (o. ä.) Datei
    Von tapferesschneiderlei im Forum Microsoft Windows
    Antworten: 1
    Letzter Beitrag: 04.02.05, 13:28
  5. datei einlesen mit URL
    Von bascha im Forum Java
    Antworten: 2
    Letzter Beitrag: 17.05.04, 13:20