Hej! Har nu en fil på 10 rader (som kommer att öka) med enbart siffror. Eftersom man ska ändra direkt i filen, alltså en config-fil så är det lite krångligt att veta vad varje rad gör. Vill därför skriva något smart framför!
Här är filen som ska läsas in.
10
10
150
255
1
0
0
30
5
30
200
200
20
20
Kod:
int width;
int height;
double vX;
double vY;
double m;
double r;
int cR, cG, cB;
double balancePos;
int startX, startY;
int distX, distY;
ifstream file("data.ini");
file >> width;
file >> height;
file >> cR;
file >> cG;
file >> cB;
file >> vX;
file >> vY;
file >> m;
file >> r;
file >> balancePos;
file >> startX;
file >> startY;
file >> distX;
file >> distY;
file.close();
Så ser koden ut nu, funkar givetvis. Men om jag nu vill ha tex Width:10 i första raden så tänkte jag att jag kör med file.ignore(6), alltså ska den ignorera 6 tecken och sedan läsa in, funkar inte då den hoppar till ny rad. Googla och fann cin.ignore(256,':');
som ignorerar upp till 256 tecken men max tills den hittar ett ":". Funkar klockrent, dock bara en gång... Kör jag denna på nästa rad skiter det sig. Varför blir det så och hur ska jag lösa det hela? Borde inte vara ett stort problem tycker man...
Ska jag läsa in värderna på något annat sätt?
Läs in varje rad med getline() och sen dela upp den i två delar, identifierare och värde.
std::string har bland annat find_first_of() som man kan använda sig av för att hitta delaren som separerar identifieraren och värdet.
När man har värdet som en sträng så kan man använda std::stringstream för att konvertera strängen till den aktuella typen man vill ha.
Borde du inte även läsa in "Width:" och, ifall det står Width: så ska värdet som står efter läggas till i variablen width. Står det Length: läggs värdet i variablen length istället?
Läs in varje rad med getline() och sen dela upp den i två delar, identifierare och värde.
std::string har bland annat find_first_of() som man kan använda sig av för att hitta delaren som separerar identifieraren och värdet.
När man har värdet som en sträng så kan man använda std::stringstream för att konvertera strängen till den aktuella typen man vill ha.
Okej, tack för det snabba svaret! Ska kika på det!
Har nu fått allt att fungera, nästan!
Skapar jag en string som innehåller "width:19" så delar den upp och konverterar till int utan problem.
Läser jag in en rad från filen går det bra, men om jag ska läsa in nästa rad så skiter det sig...
Har provat med file.ignore(1,'\0'); och file.clear(); utan resultat... Hur ska jag göra för att kunna läsa in nästa rad? Kan tillägga att jag använder samma string eftersom den ändå bara är till för att läsa in raden, dessa kanske behöver tömmas eller liknande? Kompilatorn gnäller inte utan själva programmet stängs...
__________________
Senast redigerad av Hagfjäll 2008-03-24 kl. 21:39.
Har nu fått allt att fungera, nästan!
Skapar jag en string som innehåller "width:19" så delar den upp och konverterar till int utan problem.
Läser jag in en rad från filen går det bra, men om jag ska läsa in nästa rad så skiter det sig...
Har provat med file.ignore(1,'\0'); och file.clear(); utan resultat... Hur ska jag göra för att kunna läsa in nästa rad? Kan tillägga att jag använder samma string eftersom den ändå bara är till för att läsa in raden, dessa kanske behöver tömmas eller liknande? Kompilatorn gnäller inte utan själva programmet stängs...
Har stött på problem...
Nu gäller det dock stringstream:en.
Vad jag har förstått och läst mig till så lägger den till värden om man skickar in fler än en sak. Vilket jag givetvis inte vill!
ett ex:
stringstream converter;
converter << value;
converter >> width;
nästa rad den läser in så ska det bli:
converter << value;
converter >> height;
Men då lägger den alltså till value ännu en gång, vad jag har förstått?
Har provat med converter.clear(true); (vet inte riktigt vad man ska ha för argument där...) och provat med converter.str(""); och (" ") utan att lyckas. Height får ett värde runt -18453 eller nåt sånt...
Edit: Verkar visst som det fungerar nu, mysko...
__________________
Senast redigerad av Hagfjäll 2008-03-26 kl. 10:23.
Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!