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

2 problemy w zadaniu z zastępowanie trójznaków

VPS Starter Arubacloud
0 głosów
655 wizyt
pytanie zadane 12 września 2015 w C i C++ przez jarosz9000 Nowicjusz (160 p.)

 

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <Windows.h>


using namespace std;

void zamiana(string linia, string szukaj, string zastap)
{
    int dlugosc = zastap.length();

    while(linia.find(szukaj)) // Pierwszy problem, jak petla ma sprawdzic czy w danej lini nie ma kolejnego ciągu znaków do zastapienia.
    {
        size_t pozycja = linia.find(szukaj);
        linia.replace(pozycja, dlugosc, zastap);
    }
}

char nazwaOdczyt, nazwaZapis;
string linia;

int main()
{
    cout << "Podaj sciezke do odczytu: ";
    cin >> nazwaOdczyt;

    fstream plikOdczyt;
    plikOdczyt.open(nazwaOdczyt, ios::in);  //drugi problem, jak wczytac sciezke pliku. Obecny sposób nie działa
    // ;( w tej wersji nawet nie chce się skąpilowac a jak się zmienina &nazwaOdczyt to się kompiluje ale nie działa poprawnie.
    if(plikOdczyt.good()==false)
    {
        cout << "Nie można otworzyć pliku do odczytu!";
        Sleep(2000);
        return 0;
    }

    cout << "Podaj sciezke do zapisu: ";
    cin >> nazwaZapis;

    fstream plikZapis;
    plikZapis.open(&nazwaZapis, ios::out | ios::app); // nadal drugi problem. Tak da się skompilować ale nie dziła poprawnie.

    while(!plikOdczyt.eof())
    {
        getline(plikOdczyt, linia);
        zamiana(linia, "??=", "#");
        zamiana(linia, "??/", "\ ");
        zamiana(linia, "??'", "^");
        zamiana(linia, "??(", "[");
        zamiana(linia, "??)", "]");
        zamiana(linia, "??<", "{");
        zamiana(linia, "??>", "}");
        zamiana(linia, "??-", "~");
        plikZapis << linia << endl;
    }
    plikOdczyt.close();
    plikZapis.clear();

    return 0;
}

A więc mam dwa problemy których nie mogę rozgryźć. Opisałem je w komentarzach kodu.

Pierwszy problem, jak pętla ma sprawdzić czy w danej linii nie ma kolejnego ciągu znaków do zastąpienia.

Drugi problem, jak wczytać ścieżkę pliku? Funkcja plik.open wymaga char. Jak próbuje z cin wczytać ciąg znaków char do zmiennej i chce żeby ta zmienna była parametrem to nie mogę kompilować. Chyba że gdzieś indziej popełniłem błąd.

 

3 odpowiedzi

+1 głos
odpowiedź 12 września 2015 przez Patrycjerz Mędrzec (192,340 p.)

Co do drugiego problemu, to należy korzystać z TABLICY znaków, a nie jednego. Można to także zrobić, stosując metodę c_str dostępną w klasie std::string. Zwraca ona stałą tablicę charów. Wczytanie pliku wygląda mniej więcej tak:

std::string nazwaZapis;
std::cin >> nazwaZapis;
plikZapis.open(nazwaZapis.c_str(), std::ios::out | std::ios::app);

 

+1 głos
odpowiedź 12 września 2015 przez niezalogowany
Aby rozwiązać 1. problem wystarczy zapoznać się z przykładem w dokumentacji (nie ma tam rozwiązania wprost, ale tamten przykład powinien cię naprowadzić na rozwiązanie):

http://www.cplusplus.com/reference/string/string/find/
0 głosów
odpowiedź 13 września 2015 przez jarosz9000 Nowicjusz (160 p.)

Dzięki za odpowiedź!

Wczytywanie nazwy pliku już działa.

Co do pierwszego problemu z pętlą chyba wiem o co chodzi. Zastoswałem 2 sprawdzenia aby sprawdzić czy działa poprawnie. 

void zamiana(string linia, string szukaj, string zastap)
{
    size_t dlugosc = zastap.length();
    size_t pozycja;
    while(pozycja!=string::npos)
    {
        pozycja = linia.find(szukaj);
        cout << pozycja << endl;  //sprawdzam czy działa poprawnie
        if (pozycja!=string::npos)
            linia.replace(pozycja, dlugosc, zastap);
        ile+=1;  //sprawdzam czy działa poprawnie
    }
}

Niestety nie zamienia mi znaków. Ale z tym jeszcze powalcze.

Wielkie dzięki za pomoc.

Podobne pytania

0 głosów
0 odpowiedzi 402 wizyt
pytanie zadane 9 października 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)
0 głosów
1 odpowiedź 194 wizyt
0 głosów
1 odpowiedź 449 wizyt
pytanie zadane 18 marca 2021 w C i C++ przez NukaNuka56 Obywatel (1,080 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...