[C++] Zmiana znaku w pliku, sposób wprowadzania ascii, hex, dec
Ostatnio zmodyfikowano 2017-01-15 20:12
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 : #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. |
|
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? |
|
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.
|
|
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; }
|
|
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. |
|
« 1 » |