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

92,554 zapytań

141,400 odpowiedzi

319,537 komentarzy

61,938 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...