Sign in to follow this  
highendman

reading 'commands' from a file

Recommended Posts

Hello everyone, i have a little problem with the following: I want for my program (a game) something like a configuration file, where you can write something like this: "resolution 800 600" and the program changes its resolution to 800x600 (after restarting it, of course ;)) I thought of this syntax: name_of_command value1 value2 value3 .. ; name_of_command2 value4; Here is what I tried: 1) open the file 2) read a line (not perfect: what if the command is longer than 1 line?) 3) split the string after every ";" and store the parts in a vector1 4) split every element of the vector at every whitespace and store the results in a new vector2 5) now save everything in a vector of a class: the first element of vector2 would be class.name, the rest in an array of the class. Then I would have every command (with its values), thats in the first line of the file, in in an own object of a class. But its not working. Here's the code: (I thought it would be awesome if overload an operator for this ( :roll: ))
ifstream &operator>>(ifstream &stream, vector<command> &nCommand)
{
	string line;
	vector<string> parts;
	vector<string> commands;

	int commandPerLine;

	getline(stream, line);

	stringSplit(line, ";", parts); //splits the <1. argument> at every <2. argument> and stores it in <3. argument>

	commandPerLine = parts.size();

	for(int i=0; i < commandPerLine; i++)
	{
		stringSplit(parts[i], " ", commands);

		nCommand.push_back(commands[0]); //the constructor of command stores the argument in command.name (in the example above it would be "name_of_command" or "resolution") 

		for(int j=0; j<3; j++) //the "value array" is limited to 3 values
		{
			nCommand.back().value[j] = commands[j+1]; //thats strange, but I don't know how to do it better :D
		}
	}

	return stream;
}
}
(I translated the names of variables into English, so there could be something wrong, but in the original code its right..) Well, but its nor working. For example command.value[] stores not the values, but the name, or it is empty. What I think: The code is crap and I'm dumb. Please help me. I know, that there is (must be) a _very_ simple solution, but I don't get it :D And by the way: Sorry for my bad English :)

Share this post


Link to post
Share on other sites
You can use any character with std::getline, you can use this to separate the commands by semicolons. You can then use std::stringstream rather than splitting the string up.

std::ostream& operator>>(std::ostream &stream, Command &command);

#include <sstream>

std::ostream &operator>>(std::ostream &in, std::vector<Command> &commands)
{
std::string text;
while(std::getline(in, text. ';'))
{
Command command;
std::stringstream stream(text);
if(! (stream >> command) )
{
// error handling
}
}
return stream;
}


Then the function that reads a command from the stream can be quite simple, because the stream will naturally split by whitespace.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this