Flashback bygger pepparkakshus!
2008-03-24, 19:45
  #1
Medlem
Hagfjälls avatar
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.

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?

Tack på förhand!
Citera
2008-03-24, 19:55
  #2
Medlem
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.
Citera
2008-03-24, 19:55
  #3
Medlem
Zibris avatar
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?

edit: segfault var först..
Citera
2008-03-24, 19:57
  #4
Medlem
Hagfjälls avatar
Citat:
Ursprungligen postat av segfault
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!
Citera
2008-03-24, 21:26
  #5
Medlem
Hagfjälls avatar
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.
Citera
2008-03-24, 22:21
  #6
Medlem
Zibris avatar
Känner inte till hur de funktionerna funkar, men låter som det ignorerar \n. Testa att läsa in ytterligare ett tecken efter att du läst in width:19.
Citera
2008-03-24, 23:00
  #7
Medlem
Citat:
Ursprungligen postat av Hagfjäll
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...

Kod:
while(getline(file, line))
{
  // hantera line ..
}
Citera
2008-03-25, 07:05
  #8
Medlem
Hagfjälls avatar
Citat:
Ursprungligen postat av segfault
Kod:
while(getline(file, line))
{
  // hantera line ..
}
Aha, tackar! Skall testas under dagen.
Citera
2008-03-26, 10:05
  #9
Medlem
Hagfjälls avatar
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.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in