2016-04-19 4 views
-2

Ich möchte die letzten paar Zeichen in jeder Zeile einer Textdatei lesen. Wie würde ich das in besser optimiertem C++ Code tun? Zum Beispiel hat meine Datei Namen und Alter getrennt durch einen Leerraum von 100 Studenten mit neuer Zeile für jeden Schüler, also möchte ich nur den Inhalt nach Leerraum lesen, d. H. Alter, und weitere Vergleiche durchführen.Holen Sie die Zeile nach Leerzeichen in C++

File classlist.txt 
Tanya 24 
Max 16 
Dic 21 

-Code schrieb ich bisher

#include <fstream> 
#include <iostream> 
using namespace std; 
int main() 
{ 
    ifstream class_details("classlist.txt"); 
    if (!class_details.is_open()) 
    { 
     cout<< "error"<<'\n'; 
     return; 
    } 
    string data; 
    % From here I am thinking on how to get the data after first whitespace    
    % in each line 
    class_details.close(); 
    return 0; 
    } 
+0

besser optimiert ist relativ. Welchen Code hast du jetzt? – tadman

+0

@Tanya, was hast du bisher probiert? –

+3

Der Eingabeoperator '>>' wird im Leerzeichen getrennt. –

Antwort

3

Als @Joachim Noten, der Eingang Operator >> auf weiß-Raum trennt.

Sie können es wie folgt:

string name; 
int age; 
while (class_details >> name >> age) { 
    // Use name & age here. 
} 

class_details >> name extrahieren ein Wort (non-white-space Zeichen) aus dem Eingangsstrom und speichert sie in der name Variable und gibt das ursprüngliche Stream-Objekt class_details . Dies ermöglicht die Eingabe Extraktion Verkettungs ...

(Seit class_details >> name kehrt class_details, können wir die >> auf den Rückgabewert des Ausdrucks gelten weiter, um mehr Informationen zu extrahieren.)

>> age die Extraktion weiter, Lesen (Da age eine Ganzzahlvariable ist, eine Ganzzahl aus dem Eingabestrom, und speichert sie in der Variablen age, und (Fortsetzung der Kette) gibt das ursprüngliche Streamobjekt class_details zurück.

Der Ausdruck in der while(...) Schleife zurückkehrt (aufgrund der Art, wie die Betreiber ermöglichen >> chaining), um den ursprünglichen Eingangsstrom, das, wenn sie in Zusammenhang boolean ausgewertet, den good() Zustand Strom zurückkehrt. Wenn das Ende des Datenstroms festgestellt wurde oder eine ungültige Extraktion versucht wurde oder ein anderes Problem aufgetreten ist, würde good()false zurückgeben und die Schleife beenden.

Also, ohne Chaining (aber mit dem , Operator statt), könnte die oben umgeschrieben mehr werden verbosely wie:

string name; 
int age; 
while(class_details >> name, class_details >> age, class_details.good()) { 
    // Use name & age here. 
} 

EDIT

Wenn das Ziel zu ignorieren ist die name-Feld (überspringe den Namen, ohne es in eine Variable zu extrahieren), könnten Sie die ignore() Methode verwenden, um alles bis zur nächsten sp zu überspringen ace Charakter:

int age; 
while (class_details.ignore(numeric_limits<streamsize>::max(), ' ') >> age >> ws) { 
    // Use age here. 
} 

Die >> ws verwendet wird zu Beginn des Namensfeld auf der nächsten Zeile jede white-space vom Ende des „Alter“ Feld zu verbrauchen ... insbesondere die " neue Zeile "Charakter.

Sie können die Nummer kleiner als numeric_limits<streamsize>::max() verwenden, falls gewünscht. Wähle einfach etwas länger als deinen längsten Namen.

0

Mit meinem weniger knowleage

1: Kopieren Sie jedes Mal, Daten zu vergleichen, wenn gleiche Pause

while(1) 
    { 

    fgets(str1, sizeof(str1), f); // scanf what you want 

    if(strcmp(str1,str2)==0)break; 

    strcpy(str2,str1); 

    } 

2: Endlich etwas, was seltsam hinzufügen

while(1) 
    { 

    fgets(str1, sizeof(str1), f); // scanf what you want 

    if(str1 == "key")break; 

    } 
Verwandte Themen