datalux
22-11-2007, 09:46
Hi,
folgende Situation.
Ich brauche für ein Programm ein config-file.
Dort verwende ich ein Keyword um den danach stehen Teil als Pfadangabe einzulesen (Bsp.: keyword = "/home/user/.conf/needDir/").
Dazu hab ich mal bischen rumgespielt (und das funktioniert auch):
#include <string>
#include <iostream>
using namespace std;
int main()
{
int lastPos; // of find-string
string full = "keyword test!";
string searchFor = "keyword";
string temp = "";
string::size_type loc = full.find( searchFor.c_str(), 0 );
if( loc != string::npos )
{
lastPos = full.find_last_of( searchFor.c_str() );
temp = full.substr( lastPos + 2 );
int newSize = temp.size();
temp.erase( newSize );
cout << temp << "\n";
}
else
{
cout << "\n\tELSE\n";
}
return 0;
}
Ausgabe ist dann wie gewollt "test!" (ohne "").
Jetzt hab ich das ganze in das gewollte Programm übernommen (und hier funktioniert es nicht).
int readConfigFile()
{
int returnValue = -1; // -1 => error!
string configFile = "./obrw.conf";
string configStrings[1024];
ifstream inputStream;
string s;
inputStream.open( configFile.c_str() );
int readedLines = 0; // einlesen der Vorhandenen Zeilen im Configfile
if( !inputStream )
{
cout << "Error opening input stream\n";
exit(1);
}
else
{
while( !inputStream.eof() )
{
getline( inputStream, s );
configStrings[readedLines] = s;
readedLines++;
}
inputStream.close();
}
int lastPos; // lastPos of parseword => 7 wäre hier richtig
string parseWpDir = "wpDir ="; // keyword for wallpaperDir
string tempString = ""; // includes the parsed strings
cout << "lines : " << readedLines << "\n";
for(int i = 0; i < readedLines; i++)
{
// at this position we are searching for parseString (parseWpDir)
string::size_type loc = configStrings[i].find( parseWpDir.c_str(), 0);
// string::npos if parseWpDir doesn't exist
if( loc != string::npos )
{
cout << "parse : " << parseWpDir << "\n";
cout << "configStrings[i] : " << configStrings[i] << "\n";
lastPos = configStrings[i].find_last_of( parseWpDir.c_str() );
cout << "lastPos : " << lastPos << "\n";
tempString = configStrings[i].substr(lastPos +2);
int newSize = tempString.size();
tempString.erase( newSize - 1 ); // holt das hinter " aus dem String
cout << "after erase: " << tempString << "\n";
returnValue = 999;
}
}
return returnValue;
}
Ausgabe:
lines : 3
parse : wpDir =
configStrings[i] : wpDir = "/home/user/.config/wallpapers/"
lastPos : 39
after erase: /
lastPos müsste nun aber eigentlich den Wert 7 haben.
Nun ja, ich versteh es nicht mehr wirklich.
Vielleicht übersehe ich ja auch nur eine Kleinigkeit, oder so.
Wäre schön, wenn ihr euch mal kurz mit dem code befassen könntet und vielleicht sogar den Fehler findet. :)
gruß Datalux
folgende Situation.
Ich brauche für ein Programm ein config-file.
Dort verwende ich ein Keyword um den danach stehen Teil als Pfadangabe einzulesen (Bsp.: keyword = "/home/user/.conf/needDir/").
Dazu hab ich mal bischen rumgespielt (und das funktioniert auch):
#include <string>
#include <iostream>
using namespace std;
int main()
{
int lastPos; // of find-string
string full = "keyword test!";
string searchFor = "keyword";
string temp = "";
string::size_type loc = full.find( searchFor.c_str(), 0 );
if( loc != string::npos )
{
lastPos = full.find_last_of( searchFor.c_str() );
temp = full.substr( lastPos + 2 );
int newSize = temp.size();
temp.erase( newSize );
cout << temp << "\n";
}
else
{
cout << "\n\tELSE\n";
}
return 0;
}
Ausgabe ist dann wie gewollt "test!" (ohne "").
Jetzt hab ich das ganze in das gewollte Programm übernommen (und hier funktioniert es nicht).
int readConfigFile()
{
int returnValue = -1; // -1 => error!
string configFile = "./obrw.conf";
string configStrings[1024];
ifstream inputStream;
string s;
inputStream.open( configFile.c_str() );
int readedLines = 0; // einlesen der Vorhandenen Zeilen im Configfile
if( !inputStream )
{
cout << "Error opening input stream\n";
exit(1);
}
else
{
while( !inputStream.eof() )
{
getline( inputStream, s );
configStrings[readedLines] = s;
readedLines++;
}
inputStream.close();
}
int lastPos; // lastPos of parseword => 7 wäre hier richtig
string parseWpDir = "wpDir ="; // keyword for wallpaperDir
string tempString = ""; // includes the parsed strings
cout << "lines : " << readedLines << "\n";
for(int i = 0; i < readedLines; i++)
{
// at this position we are searching for parseString (parseWpDir)
string::size_type loc = configStrings[i].find( parseWpDir.c_str(), 0);
// string::npos if parseWpDir doesn't exist
if( loc != string::npos )
{
cout << "parse : " << parseWpDir << "\n";
cout << "configStrings[i] : " << configStrings[i] << "\n";
lastPos = configStrings[i].find_last_of( parseWpDir.c_str() );
cout << "lastPos : " << lastPos << "\n";
tempString = configStrings[i].substr(lastPos +2);
int newSize = tempString.size();
tempString.erase( newSize - 1 ); // holt das hinter " aus dem String
cout << "after erase: " << tempString << "\n";
returnValue = 999;
}
}
return returnValue;
}
Ausgabe:
lines : 3
parse : wpDir =
configStrings[i] : wpDir = "/home/user/.config/wallpapers/"
lastPos : 39
after erase: /
lastPos müsste nun aber eigentlich den Wert 7 haben.
Nun ja, ich versteh es nicht mehr wirklich.
Vielleicht übersehe ich ja auch nur eine Kleinigkeit, oder so.
Wäre schön, wenn ihr euch mal kurz mit dem code befassen könntet und vielleicht sogar den Fehler findet. :)
gruß Datalux