ifstream Probleme unter Linux



  • Ich programmiere gerade ein Pacman Klon unter Ubuntu Linux mit Geany (Programm).
    Nun möchte ich eine Karte aus einer Datei einlesen die wie folgt aussieht:

    SOMOOOMOMMMOOO
    MOMMMOMOOOMOMM
    OOMOOOMOMOMOMO
    OMMOMOMOMOOOOO
    OOOOMOOOMMMOMM
    MMMMMOMOOOMOOO
    MOOOOOMMMOMMMM
    OOMMMMMOOOOOOM

    S = Spieler Startpunkt
    O = Bonuspunkt
    M = Mauerelement

    Ich habe schon einiges ausprobiert. Bsp:

    int main()
    {
    	 ifstream f;
    	 int counter = 0;
        char cstring[256];
        f.open("Karte1.map", ios::in);
        while (!f.eof())
        {
            f.getline(cstring, sizeof(cstring));
    
    		for (int a=0;a<=8;a++)
    		{
    			for(int b=0; b<=16; b++)
    			{
    				if(cstring[a] == 'M')
    				{
    					counter++;
    				}
    			}
    		}
    
    	}
    	cout << counter << endl;
        f.close();
    	return 0;
    }
    

    Aber irgendwie haut das alles nicht hin und ich habe im Moment keinen anderen Lösungsansatz. Kann man das nicht irgendwie anders lösen?


  • Mod

    Definiere "Haut irgendwie nicht hin". Lies dir vorzugsweise auch einmal den ersten Link in meiner Signatur durch.

    Kann man das nicht irgendwie anders lösen?

    Auf jeden Fall. Dein Code sieht stark nach dem gefuerchteten C mit cout aus. Benutze konsequent die C++-Sprachmittel, insbesondere die C++-Standardbibliothek, definiere saubere Klassen und mach dich ueber die feinen Unterschiede zwischen C++-Streams und C-Dateien kundig ( while (!cplusplusstream.eof()) ist zum Beispiel von der Programmlogik her falsch). Bemuehe dich auch um einen sauberen Stil, zum Beispiel Vermeidung magischer Zahlen.

    Ausserdem gehoert die Frage eher ins C++-Forum.



  • #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	ifstream f("Karte1.map");
    	int counter = 0;
    	string line;
    	while (getline(f, line)) {
    		for (int a = 0; a < line.length(); a++) {
    			if(line[a] == 'M') {
    				counter++;
    			}
    		}
    	}
    	cout << counter << endl; 
    }
    


  • #include <algorithm>
    #include <iterator>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main() {
      ifstream f("Karte1.map");
      if(not f) {
        cerr << "File not found\n";
        return 1;
      }
      unsigned const counter = count(istream_iterator<char>(f),
                                     istream_iterator<char>(),
                                     'M');
      cout << counter << endl;
    }
    


  • Ich habe das ganze jetzt über einen string gelöst den ich dann in ein char umwandel und nach den einzelnen Zeichen durchsuchen lasse. Funktioniert ganz gut hat aber noch seine Macken.


  • Mod

    andi_012 schrieb:

    hat aber noch seine Macken.

    Ja, zum Beispiel, dass du den string in char(-Array?) umwandelst. Wozu?


Anmelden zum Antworten