Aus der Datei lesen klappt nicht.

BLR

Erfahrenes Mitglied
Hallo, ich möchte versuchen aus einer .txt Datei zu lesen, die so aussieht:

mein Code:

Code:
int main(int argc, char** argv) {


 string datei = "C:\\Taschenrechner.txt";
  ifstream myfile(datei.c_str());

     if (myfile.is_open()) {
                while (myfile.getline(zeile,10)) {
                                length = myfile.tellg();  //immer der Wert -1
                                myfile.read(zeile, length); //ließt irgendwelche unlesbaren Zeichen
                                cout << "Zeile: " << zeile << "\n";
                            }

                        }


                        myfile.close();
}

ich hab auch sowas ausprobiert:


Code:
int main(int argc, char** argv) {

 char zeichen;
 string datei = "C:\\Taschenrechner.txt";
  ifstream myfile(datei.c_str());

     if (myfile.is_open()) {
                while (!myfile.iof) {
                                myfile >> zeichen;
                                cout << "Zeile: " << zeile << "\n";
                            }

                        }


                        myfile.close();
}

aber es funktioniert gar nix. Es gibt zwar viele schöne Beispiele, aber es will nicht klappen.
Was mache ich falsch?
danke
 
Hi

keiner der gezeigten Codes kompiliert so überhaupt
(beim Ersten fehlt zB. die Variable zeile, beim Zweiten gibt es kein iof).

Der erste Code schaut eher richtig aus, aber: Du liest pro Schleifendurchgang zweimal.
Lösch das read, getline reicht.
 
ja....es geht nicht ums kompilieren, sondern darum, dass nach dem öffnen des files keiner der folgenden Varianten funktioniert:


Code:
myfile.getline(char[10],10);
myfile.read(zeile, length);
myfile >> zeile;

und ich kapiere nicht, wie das gehen soll
 
Hallo BLR

Weil dieser Code keinen Sinn ergibt.

myfile.getline(char[10], 10)

Was soll das überhaupt bedeuten? Warum liest du zuerst 10 Zeichen aus und dann bis zum Ende der Datei? Das entbehrt mir jeglicher Logik. Du hast ja bereits ein getline welches die Zeile ausliest.

Am elegantesten geht es wenn du statt std::ifstream::getline nur einfach std::getline verwendest.

Viele Grüsse
Cromon
 
ja....es geht nicht ums kompilieren, sondern darum, dass nach dem öffnen des files keiner der folgenden Varianten funktioniert:
Es geht sehr wohl ums kompilieren,
weil du sonst keine der Varianten überhaupt ausprobieren kannst.
->Du zeigst uns nicht den richtigen Code, wie soll man da helfen.
 
Entschuldigung....also ich kann jetzt einlesen.
Was mich wundert ist, ich benutz keine "open"-Methode mehr, wobei ich am Ende "Close()" nutze.
Meine Frage wäre noch folgende:

In der Zeile steht z.B das Mal-Zeichen.
Dieses Zeichen wir auch in der Konsole ausgegeben. Nun möchte ich darauf prüfen, ob es ein Mal-Zeichen ist.
Dann shcreibe ich:
Code:
If (zeichen == "*")

Aber das funktioniert so nicht, beim Debuggen sehe, dass da sowas steht: "*\\r".
Dann prüfe ich auf Zeichenfolge: *\\r.

Dennoch geht er nicht in die "if" rein.
Mein Code:


Code:
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <cmath>
#include<string>
#include<fstream>
using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {


 int op1(0);
 int op2(0);

                    string zeile;
                    char operation = '+';
                    string dateiName = "meineDatei.txt";

                    ifstream lesen(dateiName.c_str());



                    if (lesen) { //wenn er die Datei finden konnte
                        while (!lesen.eof()) { //Dann lese bis zum Schluss
                            getline(lesen, zeile); //zeile in den String lesen                            
                            cout << "Zeile: " << zeile << "\n";
                            if (zeile == "+") { //auf ein ausgelesenes Zeichen prüfen
                                operation = '+';
                                continue;

                            } else if (zeile == "*\\r") {

                                operation = '*';
                                continue;
                            } else if ((op1 == 0) &&(operation != ' ') ) {

                                op1 = atoi(zeile.c_str());
                                continue;
                            } else if (op2 == 0) {

                                op2 = atoi(zeile.c_str());
                                continue;
                            } else {

                                if (operation == '+') {
                                    cout << "Ergebnis von: " << operation << op1 + op2 << "\n";


                                } else if (operation == '*') {

                                    cout << "Ergebnis von: " << operation << op1 * op2 << "\n";
                                }
                            }

                        }

                        lesen.close();

                    } 

}

Danke für jeden tipp
 
Hallo BLR

Das ist nicht richtig:
C++:
while (!lesen.eof())

Es gibt auch noch andere Fehlerbits als nur eof.

Du solltest verwenden:
C++:
while(std::getline(lesen, zeile)) {
}

Bezüglich deines Problems:
Deine Datei verwendet offenbar \r\n als Newline (windows) der Standard newline-Delimeter ist allerdings einfach \n. Das heisst die Zeile besteht also aus *\r\n und da der Delimeter nicht zurückgegeben wird bleibt übrig: *\r. Du könntest zum Beispiel alle whitespaces entfernen oder einfach schauen ob das * darin vorkommt. Da gibt es viele Möglichkeiten.

Viele Grüsse
Cromon
 
vielen Dank für deinen Tipp.

Wie schaue ich den, ob da * vorkommt****?
ich mache das ja mit:

if(zeile == "*") //funktioniert nicht, weil beim Debugen eben "*//r" angezeigt wird.

versuche ich auf "*//r" zu vergleichen:
if(zeile == "*//r") //funkioniert es komischeweise auch nicht, wobei die strings identisch sind.....
was muss ich den hier konkret machen um ein Zeichen aus einer Zeile identifizieren zu können****
irgendwie mit substring****?

NACHTRAG.

Ich habs jetzt mit substring gemacht:

zeile.substring(0,1). Dann erkennt er das richtige Zeichen.

Ich würde mich aber über eine kurze Stichpunkt-artige zusammenfassung freuen.
Wann soll man "read", "getline" oder ">>" benutzen.

Und was ist, wenn man ein einzelnes Zeichen in einer Zeile bekommen möchte****
Wie wechsle ich von einem Zeichen zum anderen und dann noch in die nächste Zeile****
Danke
 
Zuletzt bearbeitet:
Hallo BLR

Hinweis zum Teil vor deinem Nachtrag: *//r ist nicht das gleiche wie *\\r

Read: Wenn du eine fixe Anzahl Zeichen unabhängig von Kodierung, Inhalt oder Formatierung lesen willst
>>: Wenn du wortweise einlesen willst
std::getline: Wenn du zeilenweise einlesen willst

Ein einzelnes Zeichen der Zeile bekommst du entweder über nen Substring wie du das gemacht hast oder halt über den Indizierungsoperator:
zeile[0], zeile[1], ...

Von zeichen zu Zeichen wechselst du entweder indem du über den Zeilenstring iterierst oder durch direkten Zugriff wie oben

Auf die nächste Zeile greifst du wieder mit std::getline zu.

Viele Grüsse
Cromon

PS: Verwende doch bitte nicht so viele Satzzeichen wie zum Beispiel '?'. In anderen Ländern haben die Leute gar keine Satzzeichen.
 
Zurück