• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Proszę o wytłumaczenie działania seekg na podanym algorytmie.

VPS Starter Arubacloud
0 głosów
151 wizyt
pytanie zadane 15 października 2017 w C i C++ przez Chmiel Nowicjusz (120 p.)

Witam. Miałem za zadanie napisać program, który co 5 wyraz wstawi do tekstu słowo wpisane przez użytkownika. Mam z tym nie lada problem, a mianowicie:
Wynik działania mojego programu jest następujący:
Tekst Pliku: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Wynik: 1 2 3 4 5 test8 9 10 11 12test14 15 16 17 18 19 20.
Jak widać program usuwa "słowo" 6 i 7, a zastępuje je test. Wygląda to tak jakby pisał on na włączonym "insert".
Wydaje mi się, że problemem jest funkcja .seekp, i w zasadzie to nie rozumiem dlaczego.
Kod:

 

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
using namespace std;
string wyraz;

int ilosc_charow=0, x=5;
char slowo[25];
int main()
{
    fstream OtworzPlik;
    OtworzPlik.open("wstaw.txt", ios::in | ios::out);
    if(OtworzPlik.good()==true)
        cout<<"Plik poprawnie otworzony\n";

    cout<<"Jaki wyraz mam napisac w pliku, co 5 slowo?\n";
    cin>>wyraz;

    do  {
           for(int i=0; i<x; i++)
           {
            OtworzPlik>>slowo;
            ilosc_charow = ilosc_charow + strlen(slowo) + 1;
           }
            x++;
            cout<<ilosc_charow<<endl;

            OtworzPlik.seekp(ilosc_charow, ios::beg);
            OtworzPlik<<wyraz;




        }
                            while(!OtworzPlik.eof());
    return 0;
}

Prosiłbym o pomoc/wytłumaczenie błędów.

1 odpowiedź

0 głosów
odpowiedź 15 października 2017 przez obl Maniak (51,280 p.)
OtworzPlik.seekp(ilosc_charow, ios::beg);

Przesuwasz położenie miejsca odczytu/zapisu danych względem początku pliku. Co oznacza, że gdy coś wpisujesz to dane w pliku nie będą przesuwane a będą nadpisywane. Powinieneś raczej wczytać cały plik, sparsować (podzielić) zawarty w nim tekst względem spacji i zachować np. w kontenerze vector a następnie w co piątym wyrazie dodawać swoje słowo do tego kontenera. Na końcu otwierasz plik tylko do zapisu i zapisujesz uzyskane dane z vector-a.

Podobne pytania

0 głosów
2 odpowiedzi 1,195 wizyt
pytanie zadane 4 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 511 wizyt
pytanie zadane 23 października 2019 w Rozwój zawodowy, nauka, praca przez Tedi Użytkownik (580 p.)
0 głosów
2 odpowiedzi 144 wizyt
pytanie zadane 1 października 2018 w PHP przez daniel2k Obywatel (1,380 p.)

92,851 zapytań

141,792 odpowiedzi

320,879 komentarzy

62,183 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...