Unendlicher Loop bei Auslesen aus Datei

philishake

javascript enthusiast
Hey Leute,

aus irgendeinem Grund, hört er nicht auf die Letzte Zeile meiner .txt-File auszugeben, obwohl klar definiert wann er aufhören soll.

values.txt:
Code:
Laufspeed 10
Rennspeed 11
Sprintspeed 12
health 13
armor 14
ammo 15
EOF


ext_values.cpp:

Code:
    // Deklariere Variablen
    int zeilen = 0;
	char str[50];

    // Öffne Datei
    ifstream b_file (dateiname);
  
    // Gebe Dateiname aus
    cout << "\nfilename: " << dateiname << "\n\n";
    
    // Starte Zeilenweises einlesen der Daten
    while(str != "EOF")
    {
      b_file >> str;
      cout << "content(str): " << str;
      b_file >> str;
      cout << " = " << str << "\n";
    }

Danke schon im voraus :)
 
Vermutlich ist str nicht "EOF" sondern "EOF\n", aber es gibt da eh bessere methoden, um ne datei zeilen weise aus zu lesen, da nimm man in der regel den getline befehl.
C++:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(){
  ifstream b_file("Dein\\File");
  string str;

  str.clear();

  while(getline(b_file, str)){
    cout << str << endl;
  }
  cin.get();
  return 0;
}
 
Zuletzt bearbeitet von einem Moderator:
So wie er das gemacht hat, müsste das eigentlich gehen. Man müsste mal mit dem Debugger in den Inhalt von STR reinschauen, die Problematik die du beschrieben hast gibt es bei std::string nicht, sondern Bei Char-Arrays.
 
Korrekt. DAS ist aber der wahre Grund, warum der Code des Topicerstellers nicht funktioniert.

C++:
std::ifstream file_stream(file_name);
std::clog << "Dateiname: " << file_name << "\n\n"; 

char string[50];
std::memset(string, 0, sizeof(char) * 50);

while (std::strcmp(string, "EOF") != 0)
{
    file_stream >> string;
    std::clog << "Content: " << string;
}
das ist ja soweit in Ordnung. Na gut man macht es anders. Falls EOF nicht vorhanden ist, brichst du damit nie das Lesen ab. Ich glaub du meinstest eher den State des Streams eof. ;)


Zu deinem Code Ryu:
C++:
#include <iostream>
#include <fstream>
#include <string>


int main()
{
    std::ifstream file_stream("C:\\text.txt");

    std::string string;
    while (std::getline(file_stream, string)) std::clog << string << "\n";
    
    std::cin.ignore();
}
ignore, weil du das Zeichen nicht brauchst, was da noch steht. Du überprüfst nicht, ob die Datei geöffnet wurde, sonst aber i.O.

Besser:
C++:
#include <fstream>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    std::ifstream file_stream("C:/Test.txt");
    if (!file_stream) { std::cerr << "FEHLER: Datei konnte nicht geöffnet werden!"; return 1; }

    std::copy(std::istream_iterator<char>(file_stream), std::istream_iterator<char>, std::ostream_iterator(std::clog, "");
}
Und für ultimo nen kleiner Trick:
C++:
#include <fstream>
#include <iostream>

int main()
{
    std::ifstream file_stream("C:/Test.txt");
    if (!file_stream) { std::cerr << "FEHLER: Datei konnte nicht geöffnet werden!"; return 1; }

    std::clog << file_stream.rdbuf();
}
:D
 
Zurück