hallo miteinander
Ich bin ganz leicht frustriert was meine bisherigen Erfolge in C++
angeht:
Nach etwa 2 Jahren C und kurzes reinschauen in HTML, PHP und Java nahm
ich wirklich an, dass es nicht soo kompliziert sein sollte sich mit c++
anzufreunden.
Doch leider wurde ich schwer entteuscht.
Jededsmahl wenn man etwas neues ausprobieren will, werden einem ganze
Berge in den Weg gestellt:
gestern versuchte ich den ganzen Tag einen String an einem Label oder
einer Textbox auszugeben, ohne erforlg. die Programm-Strings sind
Standart, aber die GUI-Strings sind Systemstrings. Ich habe etwa 5
verschiedene Varianten versucht, diese Strings zu konvertieren von
marshall über convert.tostring, doch nichts ging. also habe ichs
aufgegeben.
Wofür braucht so ein scheiss überhaupt ein zwei verschiedene Strings?
Jetzt aber zu meinem eigentlichen Problem:
Wie kann ich aus einem .txt File Daten BRAUCHBAR einlesen, verarbeiten
und ausgeben??
Das speichern läuft ohne Probleme mit ofstream. aber ifstream ist so ne
Sache.
Ich habe mehrmals dieses Beispiel im Internet gefunden:
1
ifstreamfin("eingabe.txt");
2
ofstreamfout("ausgabe.txt");
3
stringzeile;
4
while(getline(fin,zeile))//zeilenweise einlesen
5
{
6
verarbeite(zeile);//hier kannst du dich austoben ;)
7
fout<<zeile<<endl;
8
}
Doch wie so oft, wurde ich hier auch wieder enttäuscht:
getline() als solches funktioniert nicht, da niergends die Klasse
aufgerufen wurde. mache ich aber aus getline fin.getline(fin,zeile)
gehts auch nicht da irgendwie das erste Argument nicht in ein char*
umgewandelt werden konnte.
Dabei ist doch das was ich will nicht so schwer: Textdatei zeilenweise
auslesen, Werte die durch ein ',' getrennt sind separat in einer array
speichern.
Ich hoffe, ihr könnt mir noch ein wenig wieder spass an dieser
Programmiersprache geben...
MFG
P51D
Hast Du denn mal in die Dokumentation von ifstream und ofstream
hineingesehen?
Hast Du Dir angesehen, wie deren Memberfunktionen ("Methoden") heißen?
> mache ich aber aus getline fin.getline(fin,zeile)> gehts auch nicht da irgendwie das erste Argument nicht in ein char*> umgewandelt werden konnte.
Kein Wunder.
http://www.cplusplus.com/reference/iostream/istream/getline/
Einerseits erwartet ifstream::getline als erstes Argument keine Referenz
auf sich selbst, andererseits arbeitet getline mit einzelnen Zeichen,
nicht mit string.
Die hier wie im Beispiel arbeitet mit std::string, ist keine
Memberfunktion, aber es sagt ja niemand dass es auch zwingend eine sein
muss.
http://www.cplusplus.com/reference/string/getline/> getline() als solches funktioniert nicht, da niergends die Klasse> aufgerufen wurde.
ist eine merkwuerdige Fehlerbeschreibung.
Cheers, Roger
> Ich habe mehrmals dieses Beispiel im Internet gefunden:
1
ifstreamfin("eingabe.txt");
2
ofstreamfout("ausgabe.txt");
3
stringzeile;
4
while(getline(fin,zeile))//zeilenweise einlesen
5
{
6
verarbeite(zeile);//hier kannst du dich austoben ;)
7
fout<<zeile<<endl;
8
}
Sieht soweit gut aus.
> getline() als solches funktioniert nicht, da niergends die Klasse> aufgerufen wurde.
Was meinst du mit "die Klasse aufgerufen"? Welche Klasse? Außerdem kann
man eine Klasse nicht aufrufen. Und was meinst du mit "funktioniert
nicht"? Was passiert denn statt des Einlesens? Kannst du mal das gesamte
Programm zeigen, statt nur einen Ausschnitt?
> mache ich aber aus getline fin.getline(fin,zeile)> gehts auch nicht da irgendwie das erste Argument nicht in ein char*> umgewandelt werden konnte.
Was ließ dich annehmen, daß das funktionieren könnte?
> Ich hoffe, ihr könnt mir noch ein wenig wieder spass an dieser> Programmiersprache geben...
Auch wenn's dich desillusionieren mag: Mit willkürlichem Eingeben
irgendeines Codes wird sich dein Spaß in Grenzen halten.
Patrick B. schrieb:
> gestern versuchte ich den ganzen Tag einen String an einem Label oder> einer Textbox auszugeben, ohne erforlg. die Programm-Strings sind> Standart, aber die GUI-Strings sind Systemstrings. Ich habe etwa 5> verschiedene Varianten versucht, diese Strings zu konvertieren von> marshall über convert.tostring, doch nichts ging. also habe ichs> aufgegeben.> Wofür braucht so ein scheiss überhaupt ein zwei verschiedene Strings?
Weil auch C++ anfangs kein wirkliches Konzept hatte, um mit jedem
beliebigen Zeichensatz auf diesem Planeten klarzukommen. Also hat man
sich auf ASCII beschränkt. GUI können sich das aber nicht erlauben.
Welchen Compiler benutzt du?
Der C++ Compiler vom Visual Studio 6 hatte so seine Probleme mit den
Standardlibraries. Unter anderem erinnere ich mich an Bugs in getline.
http://www.edcc.edu/faculty/paul.bladek/getline_fix.htm
Hi,
hört sich für nach Visual Studio an. Dann würde ich dir empfehlen deren
funktionen uch zu nutzen. System::IO::File::WriteAllBytes und
ReadAllBytes sind da dein Freund falls du mit cli::array arbeiten
willst.
Bei System::String bieten sich die Funtionen WriteAllText und
ReadAllText an.
Falls du lieber mit str oder char arbeitest, kannst du z.B. mit der
unteren Funktion String in char wandeln(musste ich mir auch selber
zusammen knobeln).
Das was du da verbrichst ist Managed C++. Er programmiert aber normales
C, so wie es aussieht.
Visual Studio heißt nicht unbedingt, dass man .NET benutzen muss.
Versuchs vieleicht mal mit c# (wenn Du hauptsählich Oberflächen unter
Windows programmierst) oder evt. Java wenn es auch andere
Betriebssysteme sein sollen und versuche die objektorientierten Konzepte
zu verstehen.
Ich habe 7 Jahre c programmiert und habe c++ nur gehasst. Jetzt mögen
Kommentare kommen wie "Warst zu blöd" aber das sind die Leute die meinen
man braucht die Maxwellschen Gleichungen um in einem Widerstand Strom
und Spannung zu berechnen :-)
C++ ist und bleibt ein häslicher Hybrid mit dem man viel zu viel Mist
machen kann.
Gruß, Udo
Rufus t. Firefly schrieb:
> Hast Du denn mal in die Dokumentation von ifstream und ofstream> hineingesehen?> Hast Du Dir angesehen, wie deren Memberfunktionen ("Methoden") heißen?
Ich habe mich hauptsächlich in "C für PC's" (Literatur),
http://msdn.microsoft.com/de-de/library/default.aspx und hier
schlaugemacht:
http://www.willemer.de/informatik/cpp/fileop.htm> Einerseits erwartet ifstream::getline als erstes Argument keine Referenz> auf sich selbst, andererseits arbeitet getline mit einzelnen Zeichen,> nicht mit string.
Ist aber nicht logisch, wie soll dann das Beispiel Funktionieren, wenn
der 1. Parameter nicht das File selber sein soll.
Roger Steiner schrieb:
>> getline() als solches funktioniert nicht, da niergends die Klasse>> aufgerufen wurde.>ist eine merkwuerdige Fehlerbeschreibung.
wiso merkwürdig? so wie ich das mit den Klassen und der Vererbung
begriffen habe (und das heisst noch nicht, dass ich richtig liege) muss
doch getline so aufgerufen werden:
1
fstream::getline();
2
//////////////
3
oder
4
fstreamfile;
5
file.getline();
fstream ist hier doch die Klasse, oder nicht??
Rolf Magnus schrieb:
> Und was meinst du mit "funktioniert nicht"? Was passiert denn statt des> Einlesens? Kannst du mal das gesamte> Programm zeigen, statt nur einen Ausschnitt?
Ich bin einfach nur ein wenig am Experimentieren und für ein späteres
Projekt wollte ich mir mal das Filehandling etwas aneignen.
Hier ist der C-Teil, der abgearbeitet wird, sobalt ein Button gedrückt
wurde. Der Rest ist nicht weiter Interessant
1
ifstreamfin("muster.txt");
2
ofstreamfout("test_out.txt");
3
stringzeile;
4
if(fin.good()){// Wenn die Datei geöffnet werden konnte
5
fin.seekg(0L,ios::beg);// an den Anfang der Datei springen
6
while(getline(fin,zeile)){// Solange das Ende der Datei noch nicht erreicht ist
7
fout<<zeile;
8
}
9
}
10
fin.close();
11
fout.close();
ok, dies ist genau das gleiche, wie im Beispiel, nur schreibe ich hier
das Eingelesene wieder in eine andere Datei, um zu sehen was passiert.
> ...Form1.h(250) : error C3861: "getline": Bezeichner wurde nicht> gefunden.> ...Form1.h(251) : error C2679: Binärer Operator '<<': Es konnte kein> Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ> 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)> ...Microsoft Visual Studio 9.0\VC\include\ostream(653): kann> 'std::basic_ostream<_Elem,_Traits> &std::operator> <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits>> &,const char *)' sein
und so weiter....
Rolf Magnus schrieb:
>> mache ich aber aus getline fin.getline(fin,zeile)>> gehts auch nicht da irgendwie das erste Argument nicht in ein char*>> umgewandelt werden konnte.> Was ließ dich annehmen, daß das funktionieren könnte?
getline() kann als solches nicht einfach dastehen??
=> http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Klassen
Karl heinz Buchegger schrieb:
> Welchen Compiler benutzt du?
Ich arbeite mit Visual C++ Express Edition 2008 mit SP1
Simon K. schrieb:
> Das was du da verbrichst ist Managed C++. Er programmiert aber normales> C, so wie es aussieht.
C für Mikrocontroller, ja, und da bin ich so wies die anderen in der
Schule sagen nicht gerade schlecht (aber von mir aus gesehen auch nicht
gerade sehr gut, gibt ja immer etwas neues zu lernen...).
Udo R. S schrieb:
> Ich habe 7 Jahre c programmiert und habe c++ nur gehasst. Jetzt mögen> Kommentare kommen wie "Warst zu blöd" aber das sind die Leute die meinen> man braucht die Maxwellschen Gleichungen um in einem Widerstand Strom> und Spannung zu berechnen :-)
Ich kann dir nachempfinden. Bin selber Elektroniker (URI-Gesetz läst
grüssen).
Das mit dem zu blöd, weiss nicht so recht. Ich habe bis jetzt noch nie
eine Programmiersprache gesehen, die so extrem unübersichtlich und
kompliziert ist wie c++. In der Schule haben wir das Thema Basic,
Assembler, C und jetzt OOP C++. Basic und Assembler wollte der Lehrer
begreiflicherweise nicht gross behandeln, aber beim C haben wir jetzt
schon sehr gute Eigenschaften erarbeitet, da dies je nach späterem
Fachgebiet das Täglich Brot ist.
Bin immer offen für neus, und bin auch lernwillig, von daher nach einer
Nacht darüber schlafen möchte ich die Sache wider angehen.
Danke für die zahlreichen Antworten
Patrick
Patrick B. schrieb:
> wiso merkwürdig? so wie ich das mit den Klassen und der Vererbung> begriffen habe (und das heisst noch nicht, dass ich richtig liege) muss> doch getline so aufgerufen werden:>
1
>fstream::getline();
2
>//////////////
3
>oder
4
>fstreamfile;
5
>file.getline();
6
>
> fstream ist hier doch die Klasse, oder nicht??>
Es gibt 2 getline.
Das eine ist ein Member der Klasse und kann Strings in C-Arrays
einlesen. Das andere getline ist eine freistehende Funktion, also keiner
Klasse zugehörig und liest in einen std::string ein.
Nicht alle Funktionen in C++ sind Member einer Klasse.
Das hat zum Teil auch historische Ursachen (und viele wünschten das
Normierungskommite würde endlich reagieren und das abstellen). Die
std::string Klasse zb ist erst sehr spät zu C++ hinzugekommen und man
wollte die in der Norm nicht mehr an allen Ecken und Enden einbauen.
Daher gibt es des öfteren keine Funktionalität, die mit std::string
arbeitet, obwohl sie es eigentlich sollte, sondern stattdessen C-Strings
(also Array, Pointer) benutzt.
zb. gibt es keinen Konstruktor für Filestreams, der std::string für
Dateinamen nimmt, etc ...
(Ist ein "Pain in the Ass" und ich gebe dir recht, dass das alles andere
als suboptimal ist. Ist aber so und wird auch weiterhin so bleiben. Das
Komitee ist nicht sehr reformfreudig, was vorhandene Funktionalität
angeht - aus gutem Grund.)
>> Und was meinst du mit "funktioniert nicht"? Was passiert denn statt des>> Einlesens? Kannst du mal das gesamte>> Programm zeigen, statt nur einen Ausschnitt?> Ich bin einfach nur ein wenig am Experimentieren und für ein späteres> Projekt wollte ich mir mal das Filehandling etwas aneignen.
Alles schön und gut.
Trotzdem kann niemand mit der Aussage "funktioniert nicht" viel
anfangen.
>> ...Form1.h(250) : error C3861: "getline": Bezeichner wurde nicht>> gefunden.
Ah. Da liegt der Hase.
Für das freistehende getline brauchst du den Header
#include <string>
>> ...Form1.h(251) : error C2679: Binärer Operator '<<': Es konnte kein>> Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ>> 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)>> ...Microsoft Visual Studio 9.0\VC\include\ostream(653): kann>> 'std::basic_ostream<_Elem,_Traits> &std::operator>> <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits>>> &,const char *)' sein> und so weiter....
Alles derselbe Fehler:
#include <string>
> Dabei ist doch das was ich will nicht so schwer: Textdatei> zeilenweise auslesen, Werte die durch ein ',' getrennt sind> separat in einer array speichern.
Das kann in C++ so einfach sein wie:
>> Einerseits erwartet ifstream::getline als erstes Argument keine Referenz>> auf sich selbst, andererseits arbeitet getline mit einzelnen Zeichen,>> nicht mit string.> Ist aber nicht logisch, wie soll dann das Beispiel Funktionieren, wenn> der 1. Parameter nicht das File selber sein soll.
Na, weil es als Memberfunktion einer Instanz der Klasse ifstream
aufgerufen wird. Was mag wohl ein this-Pointer sein, und wozu ist der
da?
Vom Code her würde ich sagen, dass allItems eine Array ist, aber sie
wird nicht wie eine normale Array initialisiert.
Was habe ich dann für eine Ausgabe der Werte (welches Format und welchen
Variablentyp: sting, char, int), wenn die Datei eingabe.txt so aussieht?
> 3,1024,496,4095,15> 24,255,167,3478,13
... beliebig lang
damit ich zum Beispiel alle Werte der 1. Spallte in eine Array birnge,
alle der 2. und alle der 3. Spalte, muss ich da split() verwenden?
MFG
Patrick
Patrick B. schrieb:
> Karl heinz Buchegger schrieb:>> Ah. Da liegt der Hase.>> Für das freistehende getline brauchst du den Header>> #include <string>>> LOL, wozu ist das Internet da, wenn man doch nie etwas brachbares> findet???
Du sollst eine Programmiersprache wie C++ auch nicht versuchen dadurch
zu lernen, dass du dir irgendwelche Codeschnipsel aus Foren
zusammensuchst.
Kauf dir ein Buch!
> Hier habe ich übrigends das Beispiel her:> http://www.c-plusplus.de/forum/viewtopic-var-t-is-128799-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html
Das ist nicht vollständig.
>> Danke übrigens für das Beispiel.> Könntest du es noch kommentieren??> Wofür ist das gut?
Was ein Vector ist, was es da sonst noch so alles gibt und wie man ihn
benutzt, findest du alles in einem Buch.
Und du findest das auch noch in einer Reihenfolge, so dass alles
sinnvoll aufeinander aufbaut.
Solange du keine vernünftige Literatur hast, wird das Erlernen einer
Programmiersprache immer ein frustrierendes Erlebnis bleiben.
> Vom Code her würde ich sagen, dass allItems eine Array ist, aber sie> wird nicht wie eine normale Array initialisiert.
Es ist ein vector.
Grob gesagt: Ein Array das sich selbst je nach Bedarf vergrößert.
> Was habe ich dann für eine Ausgabe der Werte (welches Format und welchen> Variablentyp: sting, char, int), wenn die Datei eingabe.txt so aussieht?>> 3,1024,496,4095,15>> 24,255,167,3478,13> ... beliebig lang
Probiers aus.
Allerdings hast du bis jetzt nur Strings und keine Zahlen :-)
> damit ich zum Beispiel alle Werte der 1. Spallte in eine Array birnge,> alle der 2. und alle der 3. Spalte, muss ich da split() verwenden?
Kann man.
Der C++ Weg wäre zb. mit dem String einer Zeile einen Stringstream
aufbauen und von dort mit Streamoperationen lesen.
Allerdings wäre auch interessant, ob die Zahlen einer Zeile zueinander
in einer Beziehung stehen, wie zb. das sind die Koordinaten eines
Rechtecks. Dann wäre der C++ Weg nicht mit 5 Arrays zu arbeiten, sondern
sich eine Klasse für ein Rechteck zu machen. Ein Rechteck Objekt selbst
weiß dann, wie es sich von einem File zu lesen hat.
Nur mal so zum Vergleich im vielgeschmähten VB.NET
Dim strContent As String = File.ReadAllText(strFileName)
Dim strLines() As String = Split(strContent, vbCrLf)
'verwurste hier die Zeilen
strContent = Join(strLines, vbCrLf)
File.WriteAllText(strFileName, strContent)
Also für mich steht C echt für "cryptic".. :-)
Karl heinz Buchegger schrieb:
> Kauf dir ein Buch!
Hab ich, ist leider noch nicht geliefert worden.
>> Hier habe ich übrigends das Beispiel her:>>> http://www.c-plusplus.de/forum/viewtopic-var-t-is-128799-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html>> Das ist nicht vollständig.
Das habe ich gemerkt.
> Solange du keine vernünftige Literatur hast, wird das Erlernen einer> Programmiersprache immer ein frustrierendes Erlebnis bleiben.
War bei PHP aber nicht ganz so schlimm und bei C auch nicht. Das www ist
gross. Leider gibts nicht nur vernünfiges und funktionierendes...
> Probiers aus.> Allerdings hast du bis jetzt nur Strings und keine Zahlen :-)
schön nach dem Moto: Jeder hilft dir gerne, aber keiner wird dir die
Hausaufgaben machen...
Hab kein Problem damit. Werde zwar später mal wieder irgendwo Hilfe
brauchen, aber ich nehme an, dass mir hier gerne geholfen wird.
> Kann man.> Der C++ Weg wäre zb. mit dem String einer Zeile einen Stringstream> aufbauen und von dort mit Streamoperationen lesen.
Ok, ich glaub, jetzt habe ich alles notiert, was ich nachschlagen muss,
sollte...
Danke für die Hilfe.
MFG
Patrick
Rex schrieb:
> Nur mal so zum Vergleich im vielgeschmähten VB.NET>>> Dim strContent As String = File.ReadAllText(strFileName)> Dim strLines() As String = Split(strContent, vbCrLf)> 'verwurste hier die Zeilen> strContent = Join(strLines, vbCrLf)> File.WriteAllText(strFileName, strContent)>>> Also für mich steht C echt für "cryptic".. :-)
OK.
Und jetzt das ganze noch einmal, wobei wir auch gerne eine
Fehlerbehandlung hätten und vorschreiben, dass pro Zeile exakt 5
Einträge vorhanden sein sollen :-)
also wenn man beim Verwursten keine Fehler einbaut, sollte der Rest
schon funktionieren.. (also ok, Datei muß da sein, Schreibrechte...)
Und die Zeile filetiert man bequem mit
Dim strFields() As String = Split(strLines(i), ",")
Funktioniert übrigens sogar mit verschiedensten Zeichensätzen. So ein
"split" wird es doch in C auch geben?
Rex schrieb:
> also wenn man beim Verwursten keine Fehler einbaut, sollte der Rest> schon funktionieren.. (also ok, Datei muß da sein, Schreibrechte...)
Darum gehts nicht.
Es soll schon vorgekommen sein, dass einzulesende Dateien Fehler in den
Daten hatten :-)
> Funktioniert übrigens sogar mit verschiedensten Zeichensätzen. So ein> "split" wird es doch in C auch geben?
In den boost Bibliotheken gibt es eines.
Rex schrieb:
> also wenn man beim Verwursten keine Fehler einbaut, sollte der Rest> schon funktionieren.. (also ok, Datei muß da sein, Schreibrechte...)>> Und die Zeile filetiert man bequem mit>> Dim strFields() As String = Split(strLines(i), ",")>> Funktioniert übrigens sogar mit verschiedensten Zeichensätzen. So ein> "split" wird es doch in C auch geben?
Wird das wieder C/C++ Hetze? ;)
"In C" gibt es erst mal gar nichts. Alles Funktionen werden durch
externe Bibliotheken oder durch c/cpp Dateien eingebunden.
Man muss also für die "split" Fähigkeit einfach nur die richtige
Bibliothek benutzen oder die Funktion selber schreiben.
C ist einfach logischer als Basic. Deswegen gibt es auch eine
(namentliche) Trennung von Compiler und Standardbibliothek. Bei Basic
ist beides einfach "Basic".
Nein, ich will nicht hetzen, ich hab auch in beiden Sprachen schon
programmiert. Es ist mir nur aufgefallen, daß gerade Anfänger mit so
einfachen Dingen bei C sehr viel Zeit verbringen.
@Karl-Heinz
Also gut, dann noch die gewünschte Fehlerbehandlung für Wurstscheiben,
die Strings sind:
try
myInt = CInt(wurstscheibe)
catch
'wirf Wurstscheibe weg
end try
:-)