Eine bestimme Zeile auslesen - Code funktioniert nicht ???
-
Hallo Leute
Ich versuche mich immoment damit auseinander zu setzen wie man zahlen aus .txt dateien ausliest. Ich habe im Internet wohl was gefunden aber nichts was ich wirklich verstanden habe. Ich habe nun einen Code gefunden und diesen naach meinen Vorstellungen verändert.
Er soll die 4 Zeile in der test.txt überprüfen und falls diese eine 27 ist soll er "27 gefunden!" ausgeben. Es funktioniert aber nicht !
Hier mein Code:#include <iostream> #include <fstream> #include <stdexcept> using namespace std; int main (void) { char line[4]; ifstream infile ("test.txt", ios::in); if (!infile) { cout << "Kein File :-(" << endl; return 1; } while (infile.getline (line, 4)) { if (line[4]==12) { printf("27 gefunden!\n"); } } cout << endl; system("PAUSE"); return 0; }
Über eine Antowrt würde ich mich freuen.
Inhalt der test.txt:0 0 0 27
-
Hab einen Fehler bemerkt,kann meinen Beitrag allerdings nicht bearbeiten.
Zeile 21:
if (line[4]==12)
muss natürlich :
if (line[4]==27)
sein
Danke nochmal
Dm3xD
-
Hi
#include <iostream> #include <fstream> #include <stdexcept> #include <conio.h> #include <vector> #include <string> using namespace std; string File(int num); int main (void) { do{ int a = 0; std::string ReturnFile = File(a++); if(ReturnFile == "27") { cout << "27"; _getch(); } }while(true); _getch(); return 0; } string File(int num) { std::vector<std::string> lines; fstream file("test.txt", ios::in); std::string line; while(std::getline(file, line)) { lines.push_back(line); } return lines[num]; }
probier mal so was in der Richtung
ist nicht schön aber es funktionier, muss nur noch die bedingung der while schleife ändern
Gruß
coco
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Dm3xD schrieb:
Ich versuche mich immoment damit auseinander zu setzen wie man zahlen aus .txt dateien ausliest. Ich habe im Internet wohl was gefunden aber nichts was ich wirklich verstanden habe.
.. es gibt im Internet gefühlte 1000000 Beispiele in denen gezeigt wird, wie man Text-Dateien, in denen Zahlen stehen, unter C++ mit getline 'ausliest'. Frei nach dem Motto 'fresst mehr Schei*** Millonen Fliegen können nicht irren'.
Einfache Regel: wenn Du Zahlen willst, so lese Zahlen.
#include <iostream> #include <fstream> #include <limits> // std::numeric_limits<> std::istream& skipline( std::istream& in ) // überliest alles bis zum Ende einer Zeile { return in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); } int main() { using namespace std; ifstream infile ("test.txt"); // kein ios::in, da ein 'i'fstream immer 'in' ist if (!infile.is_open()) { cout << "Kein File :-(" << endl; return 1; } for( int zl = 0; zl < 3; ++zl ) // 3 Zeilen überlesen infile >> skipline; int zahl; if( infile >> zahl && zahl == 27 ) // zahl lesen und prüfen { cout << "27 gefunden!\n"; } return 0; }
Für weitere Beispiele suche nach skipline hier im Forum.
:xmas2:
-
std::istream& skipline( std::istream& in ) // überliest alles bis zum Ende einer Zeile { return in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); } int main() { using namespace std; ifstream infile ("test.txt"); // kein ios::in, da ein 'i'fstream immer 'in' .... infile >> skipline; .... }
Sag mal, wartum funktioniert das eigentlich? Existiert ein
std::istream& operator>>(std::istream& in, std::istream& (*f)(std::istream&));
oder übersehe ich da einen Trick?
-
Ethon schrieb:
std::istream& skipline( std::istream& in ) // überliest alles bis zum Ende einer Zeile { return in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); } int main() { using namespace std; ifstream infile ("test.txt"); // kein ios::in, da ein 'i'fstream immer 'in' .... infile >> skipline; .... }
Sag mal, wartum funktioniert das eigentlich? Existiert ein
std::istream& operator>>(std::istream& in, std::istream& (*f)(std::istream&));
oder übersehe ich da einen Trick?
Ich kopier's mal kommentarlos(sic!) - Du hast den Nagel ja schon auf den Kopf getroffen...
n3337 schrieb:
27.7.2.2.3 basic_istream::operator>> [istream::extractors]
basic_istream<charT,traits>& operator>>
(basic_istream<charT,traits>& (*pf)(basic_istream<charT,traits>&))
1 Effects: None. This extractor does not behave as a formatted input function (as described in 27.7.2.2.1.)
2 Returns: pf(*this)
-
@Werner Salomon
Ja, zum Überlesen von Zeilen getline zu verwenden wäre wirklich total bescheuert, da muss man natürlich sofort was eigenes schreiben.
-
hustbaer schrieb:
@Werner Salomon
Ja, zum Überlesen von Zeilen getline zu verwenden wäre wirklich total bescheuert, da muss man natürlich sofort was eigenes schreiben.Hallo hustbaer,
ich unterstelle mal, dass die obige Aussage sarkastisch gemeint ist.
Meine Aussage 'getline ist doof' bezog sich nicht auf das Überlesen einer Zeile sondern auf das Einlesen von Text, um ihn nachher in Zahlen umzuwandeln. Ich will damit auch nicht sagen, dass man getline nicht benutzen soll, sondern ich sage eben: 'getline ist doof', weil getline liest nur Zeichen um Zeichen, ohne jede Interpretation.Nein man muss da nichts eigenes schreiben, man kann auch unmittelbar
in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
aufrufen (alles Standard).
Bei mehrfacher Benutzung im Code siehtskipline
halt gefälliger aus, und sagt auch mehr darüber aus, was man erreichen will.Gruß
Werner
-
getline()
hat halt den Vorteil dass es einfach ist.
Natürlich ist die von dir gezeigte Variante "besser".
Aber "besser" ist halt nicht immer besser.ps: Zahlen mit getline() einzulesen ist nicht unbedingt optimal, das stimmt schon. Ich meinte nur den "überspringe N Zeilen" Teil.
-
Dm3xD schrieb:
Hab einen Fehler bemerkt,kann meinen Beitrag allerdings nicht bearbeiten.
Da hilft registrieren.