-
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
-
Willkommen im Forum!
Zeig mal den Quelltext, sonst können wir nur raten...
-
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;
}
}
-
08.11.09 19:48 #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 hiermfg 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 erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
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;
}
}
-
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...
Anwengungsbeispiele: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; }
Anbei noch die Datei mit der ich das ganze getestet habe und das Ergebnis.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
Gruß
Enum
PS: Bitte benutze in Zukunft die Blöcke zum Code hervorheben - aus Rücksicht auf diejenigen welche versuchen den Code zu lesen..Geändert von Enumerator (08.11.09 um 22:15 Uhr) Grund: Ergänzungen
-
Hallo, vielen Dank für Hilfe!! Super...bin vielleicht zu dumm dafür.... wo soll ich den Pfad für meine Textdatei reinschreiben.... ?
(
-
Hi!
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:Jetzt tippst Du einfach den Programmnamen und dann den Pfad zu der Datei:Code :1 2
C:\Da\Bin\Ich> cd C:\Da\Ist\Das\Programm C:\Da\Ist\Das\Programm>
Und dann geht's los.Code :1
C:\Da\Ist\Das\Programm> progname C:\Users\Marina\Desktop\thai_p.txt
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
-
10.11.09 12:18 #9
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.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...
Wozu rufst du skipws auf? Erstens ist es die Standardeinstellung, zweitens wirkt sich diese Einstellung grundsätzlich nur aus wenn du Strings einliest.Code cpp:1 2 3
while (datei >> i) { ... }
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
@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)
-
10.11.09 15:27 #11
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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.
-
Tatsache!
Gibt es hier einen Smiley der sich verbeugt?
... nein, aber den hier:
-
10.11.09 16:46 #13
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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?
-
10.11.09 21:30 #15
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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.
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ßIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
PL/SQL Datei einlesen
Von zuckerbrini im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 16.02.09, 10:36 -
CSV-Datei einlesen
Von WIK-Lars im Forum PHPAntworten: 4Letzter Beitrag: 03.07.07, 17:39 -
Datei auswählen, Datei einlesen
Von -TS- im Forum Visual Basic 6.0Antworten: 4Letzter Beitrag: 21.04.05, 21:08 -
Datei einlesen in Batch- (o. ä.) Datei
Von tapferesschneiderlei im Forum Microsoft WindowsAntworten: 1Letzter Beitrag: 04.02.05, 13:28 -
datei einlesen mit URL
Von bascha im Forum JavaAntworten: 2Letzter Beitrag: 17.05.04, 13:20



1Danke

Zitieren




Login






