char-Funktionsfehler

Mr Apfelkuchen

Erfahrenes Mitglied
Guten Abend,
Code:
char ReadHighscoreName(int rang,int number){
	BOOL	Quit,Read;
	char	space,recive,bloob[10];
	HWND	hwnd;
	FILE	*file;
	int		a,b,f,j;
	
	if((file = fopen("data\\score\\highscore.bms","r")) == NULL){
		return -1;
	}
	f=1;
	j=1;
	Quit=FALSE;
	Read=FALSE;
	space = 'X';
	while(Quit==FALSE){
		space = fgetc(file);
		recive='\0';
		if(Read==TRUE){
			for(a=0;a<25;a++){
				if(j==number){
					Quit=TRUE; 
					recive = space;
				}
				j++;
				space = fgetc(file);
			}
			f++;
			Read=FALSE;
		}
		else{
			space = fgetc(file);
			if(space=='!'){
				if(f==rang*2){
					j=1;
					Read=TRUE;
				}
				f++;
			}
		}
	}
	fclose(file);

	return recive;
}
Also ich hab versucht mit dieser Funktion die Namen aus einer Datei auszulesen die so aufgebaut ist:
Code:
Punkte!Name!
Punkte!Name!
...
Es sollen nacheinander die Buchstaben des Namens ausgelesen werden, da ich mit dem schreiben einer Funktion die gleich einen ganzen string zurückgibt irgendwie überfordert war. Das komische is nur das wenn rang = 1 ist alles wie gewollt Funktioniert. Mit dem darauffolgenden Aufrufen mit rang = 2,3... ergibeben sich endlos Schleifen. Warum? Ich mein es gibt doch immer die Aufforderung (durch Quit = TRUE) die Schleife zu verlassen oder? Würde mich über jedliche Art von Hilfe freuen.

mfg Apfelkuchen
 
Also mir kommt deine Lösung etwas sehr kompliziert vor?
Für eine Datei, bei der das abschließende Ausrufezeichen am Ende der Zeile fehlt, würde folgendes funktionieren:

Code:
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct HighscoreEintrag
{
	int Punktezahl;
	string Name;
};

int main()
{
	ifstream sr("c:\\test.txt", ios::in);

	vector<HighscoreEintrag> *Highscores = new vector<HighscoreEintrag>();

	while (sr.good())
	{
		struct HighscoreEintrag he;

		char z[255];
		
		sr.getline(z, 255);

		string zeile = z;

		he.Punktezahl = atoi(zeile.substr(0, zeile.find_first_of("!")).c_str());
		he.Name = zeile.substr(zeile.find_first_of("!")+1);

		Highscores->push_back(he);
	}

	sr.close();

	for(int i=0; i < Highscores->size(); i++)
	{
	cout << "Punktzahl: " << Highscores->at(i).Punktezahl << "Name: " << Highscores->at(i).Name.c_str() << endl;
	}

	getchar();
	return 0;
}

Ich packe das Ganze vor dem Aufteilen in einen std::string, weils ohne "substr" meiner Meinung nach unnötig kompliziert wird. Und "atoi" benutz ich, weil ich den Umweg über den stringstream nicht gehen will.
Wahrscheinlich ist der Code aber noch verbesserbar :) .
 
Jo is einiges nicht ganz i.O. ...

C++:
struct HighscoreEntry
{
	unsigned int score;
	std::string name;

        friend std::istream& operator>>(std::istream& in, HighscoreEntry& dest)
        { 
                if (!(in >> dest.score)) { in.setflag(std::ios_base::failure); return in; }
                in.ignore();
                std::getline(in, dest.name, '!');
                return in;
        }
        friend std::ostream& operator<<(std::ostream& out, HighscoreEntry const& data)
        { return out << data.score << " (" << data.name << ")"; }
};

int main()
{
        std::ifstream file_stream("C:/test.txt");
        if (!file_stream) return false;

        std::vector<HighscoreEntry> data(std::istream_iterator<HighscoreEntry>(file_stream), std::istream_iterator<HighscoreEntry>());

	std::copy(data.begin(), data.end(), std::ostream_iterator<HighscoreEntry>(std::cout, "\n"));
        std::cin.ignore();
}
fertig ;)
 
Zurück