• 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.

Object Storage Arubacloud
0 głosów
150 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,122 wizyt
pytanie zadane 4 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 492 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 143 wizyt
pytanie zadane 1 października 2018 w PHP przez daniel2k Obywatel (1,380 p.)

92,759 zapytań

141,682 odpowiedzi

320,469 komentarzy

62,104 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...