[gelöst] [Newbiefrage] NeHe Tutorial 10 - Eine 3D Welt laden und sich in ihr bewegen.
-
Michael E. schrieb:
Hab ich was verpasst? Seit wann ist cout vs. printf der wichtigste Unterschied zwischen C und C++?

Wer sagt, dass es der wichtigste Unterschied ist? In diesem Thread geht es nun einmal nur um Ein-/Ausgabe, deswegen gehe ich auch nur auf die Unterschiede bei diesem Thema ein.
-
Nagut, ich pack dann wohl mal die ganze SDL OpenGL Geschichte in die Ecke und fang noch mal vorne an. Scheiße

Aber warum der Code nicht funktioniert weiss jetzt auch keine oder? Na egal, auf geht's, erstmal C++ lernen und dann SDL und OpenGL drauf setzen...

-
insanity schrieb:
Aber warum der Code nicht funktioniert weiss jetzt auch keine oder?
Finden wir es gemeinsam heraus!
Was gibt dieses Programm bei dir aus, wenn die erste Zeile in world.txt eine Leerzeile ist?
#include<stdio.h> int main() { char oneline[2]; FILE* filein; filein = fopen( "world.txt", "rt"); fgets( oneline, 2, filein); printf("%i\n", oneline[0]); printf("%i %i\n", '\n', '\r'); }Ich tippe übrigens auf
32 10 13
-
Da bekomme ich:
10 10 13[EDIT]
Wer lesen kann ist klar im Vorteil. Bekomme die selbe Ausgabe wie du. Hatte in die Textdatei als erstes nen Zeilenumbruch gemacht und kein Leerzeichen...
-
insanity schrieb:
Da bekomme ich:
10 10 13[EDIT]
Wer lesen kann ist klar im Vorteil. Bekomme die selbe Ausgabe wie du. Hatte in die Textdatei als erstes nen Zeilenumbruch gemacht und kein Leerzeichen...
Halt, halt, halt! 10 wäre ja richtig! Ich hatte mir gedacht, dass du vielleicht versehentlich ein Leerzeichen in der Datei hattest, dann würde deine Einleseroutine nämlich nicht funktionieren. So sollte sie eigentlich funktionieren, wenn du auf '\n' prüfst.
-
SeppJ schrieb:
Halt, halt, halt! 10 wäre ja richtig! Ich hatte mir gedacht, dass du vielleicht versehentlich ein Leerzeichen in der Datei hattest, dann würde deine Einleseroutine nämlich nicht funktionieren. So sollte sie eigentlich funktionieren, wenn du auf '\n' prüfst.
Ne, dann bleib ich bei meinem ersten... 10 war also die Ausgabe.
-
Ok, ich hab mich mal ein wenig eingelesen und bin jetzt soweit, allerdings komme ich jetzt nicht weiter. Wie filter ich denn jetzt am besten die Zeilen raus die Unbrauchbar sind, also alle die mit einem "/" oder "\n" beginnen? Und wie filter ich dann die Werte die ich haben will? Hab's mit sscanf versucht aber irgendwie will das bei mir nicht so wie ich will...

ifstream f; string s; f.open( "world.txt", ios::in); while(!f.eof()) { getline(f, s); } f.close();Eventuell hat ja jemand einen Tipp für mich mit dem ich dann vielleicht sogar von selbst drauf komme?

Achso, und ich hoffe das ich dann diesmal tatsächlich C++ verwende und nicht wieder C und nur glaube das es C++ ist...

-
So, Doppelposts sind zwar schon blöd, also 3fach noch blöder, aber muss grad sein...
Hab noch ein wenig rumgespielt und dabei ist mir folgendes aufgefallen bei der Ausgabe des Codes: FILE und ifstream lesen meine .txt anders aus. Also vom Inhalt her. Aber hier mal mein Code und drunter das Ergebnis. Dabei sollte eigentlich bei beiden das selbe Ergebnis rauskommen?#include <iostream> #include <string> #include <fstream> using namespace std; int main() { cout<<"----------Test1----------ifstream/string"<<endl; ifstream file1; string content1; file1.open("world.txt", ios::in); while(!file1.eof()) { getline(file1, content1); printf("%i: ", content1[0]); cout<<content1<<endl; } file1.close(); cout<<"----------Test2----------ifstream/char"<<endl; ifstream file2; char content2[256]; file2.open("world.txt", ios::in); while(!file2.eof()) { file2.getline(content2, sizeof(content2)); printf("%i: ", content2[0]); cout<<content2<<endl; } file2.close(); cout<<"----------Test3----------FILE/char"<<endl; FILE *file3; char content3[256]; file3=fopen("world.txt", "r"); while(!feof(file3)) { fgets(content3, 256, file3); printf("%i: ", content3[0]); cout<<content3<<endl; } fclose(file3); }----------Test1----------ifstream/string 0: 78: NUMPOLLIES 2 0: 47: // Test 45: -1.0 -1.0 0.0 0.0 0.0 ----------Test2----------ifstream/char 0: 78: NUMPOLLIES 2 0: 47: // Test 45: -1.0 -1.0 0.0 0.0 0.0 ----------Test3----------FILE/char 10: 78: NUMPOLLIES 2 10: 47: // Test 45: -1.0 -1.0 0.0 0.0 0.0Wieso ergibt denn bei ifstream ein Zeilenumbruch 0 und bei FILE 10? Steckt da ein höherer Sinn hinter?
-
Aus eigener Erfahrung kann das auch am Compiler liegen. Hab selber mal ne Datei im Textmodus geöffnet und mein Auslesealgorithmus funktionierte nur wenn ich z.B. kein fstream::tellg() benutzt habe. War sehr seltsam, aber war tatsächlich so. Ging btw im binarymodus!
Für C++ statt printf cout benutzen.
-
kingcools schrieb:
Aus eigener Erfahrung kann das auch am Compiler liegen. Hab selber mal ne Datei im Textmodus geöffnet und mein Auslesealgorithmus funktionierte nur wenn ich z.B. kein fstream::tellg() benutzt habe. War sehr seltsam, aber war tatsächlich so. Ging btw im binarymodus!
Für C++ statt printf cout benutzen.Wollte mit dem printf nur das erste Zeichen einer Zeile als Int ausgeben. Wie ist denn da der richtige Befehl in C++? Ansonsten verwende ich ja cout. Oder wie meintest du das jetzt?
Und wie ist der richtige Befehl um aus einem String bestimmt Daten als z.B. Int oder Float auszulesen? Z.B. will ich aus der Textzeile "NUMPOLLIES 2\n" nur die 2 Auslesen und das in eine Int Variable speichern. Der Text ist dabei immer derselbe, nur die Zahl kann sich halt ändern.
-
Ok, ich schon wieder...
Ich habe es jetzt soweit am laufen das er mir keine Kommentar und keine Leerzeilen ausgibt. Aber da ich es wohl häufiger in meinem Code brauchen werde das 1 Zeile ausgelesen werden soll ohne Kommentare und Leerzeilen wollte ich das ganze was ich zwischen die beiden Kommentare gesetzt habe in eine eigene Funktion packen. Leider komme ich da jetzt nicht weiter. Wie muss ich es denn der neuen Funktion, ich nenne sie mal "ReadLine()" die Infos übergeben um welchen fstream es sich denn handelt und in welchen String er das Ergebnis speichern soll?#include <iostream> #include <string> #include <fstream> using namespace std; int main() { ifstream file; string content; file.open("world.txt", ios::in); while(!file.eof()) { // Ab hier... do { getline(file, content); } while(!file.eof() && (content[0]=='/' || content[0]=='\n')); // ...bis hier cout<<content<<endl; } file.close(); }Ich hab's probiert, bitte nicht lachen, mit:
#include <iostream> #include <string> #include <fstream> using namespace std; void ReadLine(ifstream *file, string *content) { do { getline(file, content); } while(!file.eof() && (content[0]=='/' || content[0]=='\n')); } int main() { ifstream file; string content; file.open("world.txt", ios::in); while(!file.eof()) { ReadLine(file, content); cout<<content<<endl; } file.close(); }Aber da bekomme ich leider diese Fehler:
line 10: error: no matching function for call to 'getline(std::ifstream*&, std::string*&)
line 11: error: request for member 'eof' in 'file', which is of non-class type 'std::ifstream*
line 11: error: no match for 'operator==' in '* content == '/'
line 11: error: no match for 'operator==' in '* content == '\012'
line 21: error: invalid conversion from 'void*' to 'std::ifstream*
line 21: error: cannot convert 'std::string' to 'std::string*' for argument '2' to 'void ReadLine(std::ifstream*, std::string*)
-
void ReadLine(ifstream &file, string &content) { do { getline(file, content); } while(!file.eof() && (content[0]=='/' || content[0]=='\n')); }Dir ist aber klar, dass am Ende content nur die letzte Zeile enthält? Du willst wahrscheinlich/vielleicht einen std::vectorstd::string& übergeben.
-
Ne möchte nur eine Zeile haben. Danke für den Code.
Funktioniert auf anhieb. 
Womit ich leider dann doch bei meinem nächsten Problem wäre. Ich würde gerne die Textzeile in "content" filtern. In der Richtung:
sscanf(content, "NUMPOLLIES %d\n", &zahl);
DIe Textzeile in "content" ist aktuell "NUMPOLLIES 2\n" und ich hätte halt gerne die 2 als Int in meiner Variable zahl.
Aber sscanf funktioniert nur mit char und nicht mit string oder sehe ich das falsch? Gibt's eine Möglichkeit auch einen String in der Art zu durchsuchen und Werte in Variablen zu speichern?
[EDIT]
So, hab's mir jetzt so gebastellt, gibt's da keinen schöneren Weg in C++?sscanf(content.c_str(), "NUMPOLLIES %d\n", &zahl);