Siemka, powiem ci gdzie masz błąd (mogę się mylić bo kod analizowałem w pamięci), a ty go rozwiążesz, nie zrobię nic za ciebie, jak chcesz się nauczyć programować to najpierw naucz się sam sobie radzić
Ok przejdźmy do rzeczy:
Mówisz o rzeczywistym pliku *.ini czy o pliku, któremu nadałeś to rozszerzenie? Zakładam, że to drugie (jeśli nie to nie męcz się z tym i zajrzyj do dokumentacji WinAPI albo znajdź w necie jakąś bibliotekę do obsługi takich plików); program nie działa (a raczej działa błędnie) bo czytasz getline’em osiem linijek a następnie tam gdzie funkcja skończyła czytanie dopisujesz liczbę, potem znowu to robisz, tym razem za ostatnio dopisaną, i znowu, w efekcie gdy mnożnik to kolejno 0.503d, 23.0d, 398.9932d, ósma linijka wygląda tak:
0.50323.0398.9932
Oczywiście zakładam, że ta ósma linijka istnieje w tym pliku i nigdzie wcześniej nie ma !EOF.
Ok, to wyjaśniłem na czym polega problem, więc teraz twoja kolej żeby go rozwiązać
PS.
Zamiast kombinować z getline(), przesuń po prostu wewnętrzny kursor pliku do ósmej linijki (poszukaj w dokumentacji jak to się robi), zwiększysz wydajność i z kilku linijek zrobisz jedną.
Może plik jest chroniony przez zapisem, spróbuj cokolwiek do niego dopisać. Co do kodu się nie wypowiem ponieważ twoje podejście jest mało dla mnie zrozumiałe ;]
Niejako dołączam się do pytania, bo próbowałem dojść i nie wiem czemu to nie działa. Czy ktoś znający lepiej iostream i fstream mógłby się wypowiedzieć? Żeby było zabawniej, poniższy kod nie pisze do pliku, chyba, że doda się tellp lub tellg przed wywołaniem operator<<:
#include
#include
#include
int main()
{
std::fstream plik;
std::string dane;
plik.open("test.ini");
if(plik.good())
{
for(int i = 0; i < 7; ++i)
getline( plik, dane ); //wczytanie CAŁEGO jednego wiersza danych
// plik.tellp(); // ?
plik << 'A';
plik.flush();
plik.close();
}
return 0;
}
W celach testowych stworzyłem sobie po prostu plik który w w N-tej linii ma cyfrę N. Gdy odczyta się pozycje w pliku przez tellp/tellg odpis się odbywa. Czy któryś z bardziej doświadczonych kolegów mógłby to skomentować?
Kompiluję g++ 4.5.2, bez żadnych dodatkowych flag.
Jednak, to jest zwykły plik txt zapisany jako .ini.
wygląda mniej więcej tak
10 robi costam costam
2 odpowiada za to i za to
0.4 ustawia to i to
#include
#include
#include
int main()
{
std::fstream plik;
std::string dane;
plik.open("test.ini", std::ios::in|std::ios::out);
if(plik.good())
{
for(int i = 0; i < 7; ++i)
getline( plik, dane ); //wczytanie CAŁEGO jednego wiersza danych
// plik.tellp(); // ?
plik << 'A';
plik.flush();
plik.close();
}
return 0;
}
podmieniłem ten kod od Sawyera i to dalej nic nie robi
Owszem lubię komplikować życie bez komplikacji byłoby nudne ;], ale twoim sposobem, dodając tylko nagłówkowe, int main i returna. Nadal niestety nie działa (tzn po skompilowaniu w pliku test.ini nie ma żadnego A). Może to brak jakiejś biblioteki w kompilatorze. Natomiast mój bardzo komplikujący tak prostą rzecz i ciężkawy program to a w 8 linijce dodaje. Ten kod również wydaje się dobry, jednak coś z nim nie tak, podobnie myślał Sawyer, ty pomijasz flush, jednak sam przyzwał że nie działa i nie wie dlaczego ;]
Bo żeby coś wpisać w tej ósmej linijce to musisz ją najpierw mieć, pokopaj w enter w tym pliku tak żeby zrobić tą ósmą linijkę i wtedy odpal kod [alex]-a.
Popróbowałem na innych wersjach g++, 4.4 i 4.5 dają to dziwne zachowanie, natomiast na 4.6 działa zgodnie z przewidywaniami, wygląda to na dziwny bug g++.
Na necie wszystkie takie pytania sprowadzają się do przepisania pliku do innego, a potem do ich podmiany. Ew do zapisu w momencie danej, ale to traci pozostałą jego część ;/