Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zmiana znaku w pliku, sposób wprowadzania ascii, hex, dec

Ostatnio zmodyfikowano 2017-01-15 20:12
Autor Wiadomość
kilopierogow
Temat założony przez niniejszego użytkownika
[C++] Zmiana znaku w pliku, sposób wprowadzania ascii, hex, dec
» 2017-01-14 19:16:38
Witam,
próbuję napisać program, który będzie w stanie przyjąć od użytkownika znak/znaki w ASCII(a,b,&,1,2,>), hex(10,2e,3f,81) lub dec(1,2,3,8,32) i NADPISAĆ go do pliku (który już ma dane) w miejsce wcześniej wskazane.
Oto fragment kodu :
C/C++
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    cout << "Podaj nazwe pliku : ";
    string nazwa;
    cin >> nazwa;
    cout << endl;
   
    fstream plik;
   
    plik.open( nazwa.c_str(), ios::in | ios::out | ios::binary );
   
    if( !plik )
    {
        cout << "Plik nie zostal otwarty\n";
        return 1;
    }
    cout << "Ktory znak chcesz zmienic?" << endl;
    int znak_do_zmiany;
    cin >> znak_do_zmiany;
    cout << endl;
   
    plik.seekp( znak_do_zmiany - 1 );
   
    cout << "W jakim systemie chcesz wpisac znak?" << endl;
    cout << "1 - ASCII" << endl;
    cout << "2 - system heksadecymalny" << endl;
    cout << "3 - system dziesietny" << endl;
    int system;
    cin >> system;
    cout << endl;
   
    string nowy_znak;
   
    if( system == 1 )
    {
        cout << "Podaj znak : ";
        cin >> nowy_znak;
    }
   
    else if( system == 2 )
    {
        cout << "Podaj znak : ";
        cin >> nowy_znak;
       
    }
   
    else if( system == 3 )
    {
        cout << "Podaj znak : ";
        cin >> nowy_znak;
       
    }
   
    plik.write( & nowy_znak[ 0 ], nowy_znak.length() );
    plik.close();
   
    return 0;
}
Właśnie sobie uświadomiłem, że ten fragment nie chce nawet zapisywać (?) zmian do pliku (co w całym kodzie działa (nie ma sensu go tu wklejać , jest za długi, i niezwiązany z tematem)).
Bardziej chodziło mi o przedstawienie problemu by było łatwiej mnie zrozumieć.
Zagadką dla mnie jest przekształcenie i kontrolowanie długości wpisanych danych od user'a.

Pozdrawiam.
P-156436
mokrowski
» 2017-01-14 21:51:21
Możesz przeredagować pytanie. Przyznam że nie wiem czy odnosić się do kodu czy nie oraz .... jakie jest dokładnie pytanie/problem?
P-156445
kilopierogow
Temat założony przez niniejszego użytkownika
» 2017-01-14 23:50:07
Trochę bałaganu narobiłem, przepraszam.

Przykładowa sytuacja : w pliku mam legendarne zdanie "Ala ma kota". Użytkownik wybiera który znak chce zmienić - pierwszy. Użytkownik wybiera system w jakim chce wpisać kod nowego znaku. Może wybrać : ASCII -> "O", hex -> "4f", dec -> "79". Po całej akcji w pliku jest nowe zdanie "Ola ma kota".

Pytaniem moim jest jak w efektywny (funkcja(?)) i bezbłędny sposób wykonać konwersję z dostępnych systemów na plik otwarty w ios::binary (tak żeby tam się po prostu zmienił znak).
Ponadto trzeba mieć na uwadze, że należy zadbać o długość wprowadzanego polecenia (np. ASCII 1 znakowy) i nie wykraczanie poza dostępny zakres (np hex nie można dać -1, bo to nie jest żaden znak).

Fragment kodu podałem żeby zobrazować swoje rozterki. Możesz na nim przedstawić swoje rozwiązanie.

Pozdrawiam i dzięki za zainteresowanie.
P-156447
mokrowski
» 2017-01-15 00:34:49
Ten sposób programowania jest na razie niedostateczny. Rozumiem że nie znasz jeszcze funkcji. Stąd taki niezbyt ładny kod:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <cstdlib>

using namespace std;

int main() {
   
    string nazwa_pliku;
    cout << "Podaj nazwe pliku : ";
    cin >> nazwa_pliku;

    fstream plik(nazwa_pliku, ios::in | ios::out | ios::binary);

    if(not plik) {
        cerr << "Błąd: Plik " << nazwa_pliku << " nie został otwarty.\n";
        exit(EXIT_FAILURE);
    }
    cout << "Ktory znak chcesz zmienic. Podaj jego indeks: ";
    unsigned znak_do_zmiany;
    cin >> znak_do_zmiany;
    if(not cin) {
        cerr << "Błąd: Nie wprowadziłeś poprawnej liczby.\n";
        exit(EXIT_FAILURE);
    }

    plik.seekp( znak_do_zmiany - 1 );
   
    cout << "Systemy wprowadzania danych:\n"
        << "1 - ASCII\n"
        << "2 - system heksadecymalny\n"
        << "3 - system dziesietny\n"
        << "W jakim systemie chcesz wpisac znak: ";
    unsigned system;
    cin >> system;
    if(not cin) {
        cerr << "Błąd: Nie wprowadziłeś poprawnej liczby.\n";
        exit(EXIT_FAILURE);
    }

    unsigned nowe_dane = 0;

    if( system == 1 ) {
        char nowy_znak = '\0';
        cout << "Podaj znak : ";
        cin >> nowy_znak;
        if(not cin) {
            cerr << "Błąd: Nie wprowadziłeś poprawnego znaku.\n";
            exit(EXIT_FAILURE);
        }
        nowe_dane = static_cast<unsigned>(nowy_znak);
    }

    else if( system == 2 ) {
        cout << "Podaj znak : ";
        cin >> hex >> nowe_dane;
    }

    else if( system == 3 ) {
        cout << "Podaj znak : ";
        cin >> dec >> nowe_dane;
    }
   
    plik << static_cast<char>(nowe_dane);
    
    return EXIT_SUCCESS;
}
P-156451
kilopierogow
Temat założony przez niniejszego użytkownika
» 2017-01-15 20:12:04
Dzięki mokrowski, nie o to dokładnie mi chodziło (problemy z przedstawieniem problemu), ale przydało się i już sobie poradziłem.
Pozdrawiam, zamykam.
P-156462
« 1 »
  Strona 1 z 1