Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi,

Ich hätt da mal ne Frag (mal wieder :rolleyes: )

Mir gehts darum aus einer txt ganz bestimmte Sachen einzeln auszulesen.

Hier ein kleines Bsp.

[.txt]

Wert = 5

Wert = 123

Wert = abc

[/.txt]

Es geht mir zum einen darum, den Teil "Wert =" zu ignorieren und zum anderen nicht alles (so wie ich es in vielen Tutorials gelesen hab) gleichzeitig auszulesen und dann ungewollte Eingaben einfach dann zu ignorieren, sondern ohne viel Drumherum gezielt zum Beispiel die Zahlen der zweiten Zeile auszulesen. Ist dieses gezielte lesen so überhaupt möglich?

Mfg MMM

Geschrieben
Ist dieses gezielte lesen so überhaupt möglich?

Es ist nur dann möglich, wenn Du vor dem Lesen bereits genau weißt, an welcher Position in der Textdatei die von Dir gesuchten Werte stehen. Dazu müsste das Format der Datei sehr starr sein, was auf Textdateien dieser Art zur Konfiguration im Allgemeinen nicht zutrifft. Also: In der Regel musst Du zumindest alles bis zum gewünschten Wert lesen und zumindest rudimentär parsen.

Geschrieben
Hi,

möglich ist das. Du hattest die Frage schonmal in einem anderen Thread gestellt:

http://forum.fachinformatiker.de/showthread.php?t=74745

Dort hatte ich gesagt, du solltest dir mal mein Beispiel angucken, was mit kleinen Änderungen deine Anforderungen erfüllen würde.

Oh! Ich dachte das Beispiel bezog sich gar nicht auf mich. Okay danke, werds mir mal gründlich unter die Lupe nehmen. Danke nochmal für den Hinweis.

  • 2 Wochen später...
Geschrieben

Nochmal ich:


	string str, str2;


	ifstream a_file("test.txt");


	a_file.ignore(1,'\n');


	a_file >> str;


	cout << str << '\n';


         // Ab hier möchte ich in die 2te Zeile.

	a_file.ignore(2, '\n');


	a_file >> str2;


	cout << str2 << '\n';

Des a_file.ignore ignoriert mir die gewollten Zeichen und das ist alles so okay, aber ich will jetzt in die zweite Zeile springen und etwas wieder ignorieren, aber wie?

Geschrieben

Hi,

so z. B.:


#include <iostream>

#include <string>

#include <fstream>


using namespace std;


int main()

{

    string Zeile;

    ifstream my_File("data.txt");


    my_File.ignore(1024, '=');


    while(getline(my_File, Zeile) ){

        my_File.ignore(1024, '=');

        cout << Zeile << endl;

    }

    return 0;

}


Geschrieben

Und um die 3te Zeile auszulesen können, müsste ich das dann so machen.



int main()

{


	string Zeile;

	string Zeile2;

    ifstream my_File("test.txt");


    my_File.ignore(8, '\n');


    while(getline(my_File, Zeile) ){

        my_File.ignore(8, '\n');

        cout << Zeile << endl;


		while(getline(my_File, Zeile2) ){

			my_File.ignore(8, '\n');

			cout << Zeile2 << endl;

		}


    }

Wie Du siehst, hab ich mir das mal etwas genauer angeschaut und ich bin dir auch echt dankbar für den Code, aber ... des is halt alles etwas umständlich wenn es um viele Zeilen geht, aber demnach, gibt es keine "einfachere" Lösung zum zeilenweisen+ignoriert auslesen.

Aber mir ist noch eine Möglichkeit eingefallen, wie wärs wenn man alles ganz standardmäßig, die komplette Zeile einliest und dann nachher den String nimmt und den ungewünschten Teil abschneidet. Hab zwar das noch nie gemacht, aber müsste doch zumindest theoretisch gehen oder?

Geschrieben

Hi,

ne, für die erste Zeile muss ein ignore vor der while-Schleife stehen, die anderen Zeilen werden in der While Schleife gelesen. Probier das doch einfach mal aus?! Dann hätte es eigentlich klar sein müssen.....

Geschrieben

Hi,

wenn sich das Zeichen ändert aber die Position nicht, kannst du ja sagen, dass du es nach dem ersten Leerzeichen getrennt haben möchtest.

Es gibt im Grunde nur 2 Möglichkeiten: Du suchst dir Gemeinsamkeiten raus, die in den Zeilen vorkommen und schreibst einen entsprechenden Algorithmus, oder musst alle Zeilen auf alle möglichen Trennzeichen hin untersuchen.

Vielleicht postest du einfach mal so 2-10 Zeilen des zu untersuchenden Textes und den zu trennenden Teil, damit ich mir das mal vorstellen kann.

Geschrieben

... die der letzte post hat mir schon ganz gut gefallen, der war schon in die richtige Richtung

Den perfekten Algorithmus kenne ich auch nicht, dann hätte ich jetzt nen Patent und jeden Menge Geld ;-)

Im Allgemeinen kommst Du ziemlich gut, wenn Du immer bis zum nächsten whitespace liesst (mit man ascii, kannst Du den Code nachschlagen, mit dem das whitespace codiert ist), das ist statistisch schneller als immer bis zum Ende der Zeile zu lesen. (Überlegs Dir mal in Ruhe.)

Und dann musst Du Dir nur noch weiter überlegen, was Du Dir ausgeben lässt.

Bei diesem Beispiel holst Du Dir nach dem "=" alles heraus (Leseabbruch ist dann beim nächsten whitespace).

Dass Du dann noch das feature hast, dass Du nur jeden 2.Wert ausliest, dass kannst Du ganz einfach über eine Zählschleife machen ((oder irgendwie noch genialer, fällt mir aber gerade nicht ein))

.......................................

nun zur Existenz eines Files ...

Überleg Dir mal bitte, was ein file ist ....

- kannste Dir ja ruhig mit den Kästchen, die die einzelnen Speicherstellen sind, vorstellen

- dann wirst Du herausfinden, dass ein file aus einem Pfeil und einem EOF-Zeichen besteht ... der Pfeil ist die Adresse (z.B. 0xFFFF) auf den Anfang des files im Speicher und das EOF ist manchmal das Einzigste, aber immer das letzte Zeichen eines jeden Files

(uraltes Konzept, funktioniert aber immer ;-) )

... Du brauchst also nur gucken ob Dein file ein EOF enthält, bzw. viel schoener, gleich nur bis zum EOF mit der Schleife gehen

(solche Gedanken/hinweise zu solchen Gedanken stehen ganz cool in den Standardbüchern von den Erfindern einer Sprache, wie C von kernighan und ritchie oder von gut auskommentierten Anfängerbüchern vom Springer Verlag

aber nerv ruhig auch mal Deine Kumpels, gemeinsam überlegen ist viel schöner, als die Lösung auf einem Silbertablett serviert zu bekommen)

so in C sind das vielleicht 7 nette Zeilchen mit allem Schnickschnack drumherum (wenn jeder Befehl auf einer Zeile steht) ... also kein Problem, oder?

Du hast das doch jetzt verstanden, also brauchst Du das nur noch mal kurz zu implementieren ... es sind kleine Unterschiede in den verschiedenen Sprachen, aber der Grundgedanke ist immer gleich, und der steht schon mal hier. Dann kannst Du das zügig machen.

Liebe Grüsse,

sissy66.

Geschrieben

Ich bin euch beiden ja schon sehr dankbar das ihr mir helfen wollt, aber mir fehlt ganz ehrlich die nötige Erfahrung damit ich was anständiges aus euren Texten hinkrieg.

Mir sind im Moment Beispiel lieber.


	[COptions]

	CMethod is = 1

	[TOptions]

	Source is = 

	Destination is = 

	Delete original txt when ready = no

	TMethod is = 1

	Write logfile = yes

Okay das ist meine .txt mit meinen Einstellungen. Ich hätt halt jetzt entweder wie oben das mit den while Schleifen gemacht, oder alle Strings eingelesen und den Anfang den ich nicht brauch gelöscht. Aber könntet mir jetzt sagen, wie das ganz sich jetzt noch geschickter auslesen lässt.

Geschrieben

Hallo,

Im Allgemeinen kommst Du ziemlich gut, wenn Du immer bis zum nächsten whitespace liesst (mit man ascii, kannst Du den Code nachschlagen, mit dem das whitespace codiert ist), das ist statistisch schneller als immer bis zum Ende der Zeile zu lesen. (Überlegs Dir mal in Ruhe.)

Wieso ist es "statistisch schneller", wenn man bis zum nächsten Whitespace einliest? Hast Du da mal eine Referenz? Geschwindigkeit erreicht man durch möglichst wenige Lesezugriffe.

Überleg Dir mal bitte, was ein file ist ....

- kannste Dir ja ruhig mit den Kästchen, die die einzelnen Speicherstellen sind, vorstellen

- dann wirst Du herausfinden, dass ein file aus einem Pfeil und einem EOF-Zeichen besteht ... der Pfeil ist die Adresse (z.B. 0xFFFF) auf den Anfang des files im Speicher und das EOF ist manchmal das Einzigste, aber immer das letzte Zeichen eines jeden Files

Versteh ich nicht, aus was für einem "Pfeil" besteht denn ein File?!

so in C sind das vielleicht 7 nette Zeilchen mit allem Schnickschnack drumherum (wenn jeder Befehl auf einer Zeile steht) ... also kein Problem, oder?

Das poste doch diese sieben Zeilen, dann ist dem Fragesteller auch geholfen.

Nic

Geschrieben

Hi,

möglicherweise ist mir das immer noch nicht ganz klar, aber mein Beispiel würde unabhängig vom Trennzeichen erstmal alles ausgeben.

Dieses Beispiel entfernt alle Gleichheitszeichen und gibt die entsprechenden Werte aus:


#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
string line;
string notPrintable=" ";
size_t pos;
ifstream my_File("money.txt");

// Erste Zeile prüfen...
my_File.ignore(1024, '=');

// Restliche Zeilen prüfen...
while(getline(my_File, line) ){
// Alles verwerfen, was vor dem ersten =-Zeichen steht...
my_File.ignore(1024, '=');

// Position merken, an der das erste Zeichen steht, was nicht
// in notPrintable vorhanden ist...
pos = line.find_first_not_of(notPrintable);
if(pos != string::npos)
// Ab dieser Stelle ausgeben...
cout << line.substr(pos) << endl;
else
// Wenn nicht gefunden, ist die Zeile komplett Leer...
cout << "N/A" << endl;
}
return 0;
}

[/php]

Auch wenn es vielleicht nicht 100%ig deine Anforderungen erfüllt, kannst du doch evtl. etws an den Kommentaren erkennen. Ansonsten, wenn du nicht klarkommst, empfehle ich dir diese Seite:

www.cppreference.com

Dort sind alle Funktion aufgelistet und werden gut erklärt.

Geschrieben

Aha okay werds mal ausprobieren. Danke nochmal.

Aber ich hätt da nochmal ein kleines Problemchen:

Wie lässt sich ein Zeichen eines Strings in einen int konvertieren?

Bsp.:


...

string str;

int xyz;


cout << str[8] << '\n'; // soweit alles klar


// so und jetzt wollt ich str[8] in eine int konvertieren mit atoi, weil man damit 

//ja sonst immer strings in ints konvertiert, geht aber komischer weise hier net

xyz = atoi(str[8]); 


cout << xyz << '\n';


Geschrieben

Hallo,

was möchtest Du denn genau konvertieren? Einen Zifferstring (also beispielsweise den String "1234") in ein int oder benötigst Du den ASCII-Wert von '\n'? Im ersten Fall kannst Du mit "atoi()" arbeiten im zweiten ist eine direkte Konvertierung nicht nötig:

int xyz='\n';

Nic

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...