Datei einlesen in C++

marina75

Grünschnabel
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
 
Hallo, das ist der Queltest:
1
1
1
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.

Code:
#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;
}
}
 
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:
cout << a[i];  cin.get();

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

std::vector<int> v;

Siehe hier
 
Danke für Hilfe
Ist dass richtig Leider ich habe mathe und statistik studiert... Bin kein Profi in C++.....
Code:
#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;
}
}
 
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... :p
C++:
#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:
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..
 

Anhänge

  • test.txt
    290 Bytes · Aufrufe: 51
  • ergebnis.txt
    790 Bytes · Aufrufe: 46
Zuletzt bearbeitet:
Hallo, vielen Dank für Hilfe!! Super...bin vielleicht zu dumm dafür.... wo soll ich den Pfad für meine Textdatei reinschreiben.... ? :((
 
Hi!

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:
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:
C:\Da\Ist\Das\Programm> progname C:\Users\Marina\Desktop\thai_p.txt
Und dann geht's los. :p 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:
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:
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:
C++:
#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
 
Hi.
C++:
    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...
C++:
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ß
 
@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? :p
 
Zuletzt bearbeitet:
Zurück