[C++] Obsługa pliku przy pomocy fstream
Ostatnio zmodyfikowano 2013-04-06 22:12
Rafi Temat założony przez niniejszego użytkownika |
[C++] Obsługa pliku przy pomocy fstream » 2013-04-06 11:52:56 Witam!
Przerabiając podstawowe operacje na plikach, napisałem ten programik
#include <iostream> #include <fstream> #include <string> #include <windows.h>
using namespace std;
void menu() { cout << "Jakie chcesz podjac dzialanie?" << endl; cout << "\n[O]tworz plik" << endl; cout << "[Z]mien nazwe" << endl; cout << "[K]opiuj plik" << endl; cout << "[U]sun plik" << endl; cout << "[P]rzenies plik" << endl; cout << "[E]XIT " << endl; }
int main() { char sciezka[ MAX_PATH ]; char wybor, t; char nowa_sciezka[ MAX_PATH ]; string linia; cout << "Podaj sciezke pliku" << endl; cin >> sciezka; menu(); do { cin >> wybor; switch( wybor ) { case 'O': { ifstream plik( sciezka ); if( plik.good() ) { cout << "Wczytywanie sie powiodlo\n\nWypisac zawartosc? [t]/[n]" << endl; cin >> t; if( t == 't' ) { while( getline( plik, linia ) ) cout << linia << endl; } } else cout << "BLAD"; break; } case 'Z': { cout << "Podaj nowa nazwe pliku wraz z sciezka dostepu." << endl; cin >> nowa_sciezka; rename( sciezka, nowa_sciezka ); break; } case 'K': { cout << "Podaj nowa sciezke" << endl; cin >> nowa_sciezka; if( CopyFileA( sciezka, nowa_sciezka, false ) ) { cout << "Kopiowanie sie powiodlo!" << endl; break; } else { cout << "BLAD" << endl; break; } } case 'P': { cout << "Podaj gdzie przeniesc plik(sciezke dostepu)" << endl; cin >> nowa_sciezka; if( MoveFileA( sciezka, nowa_sciezka ) ) { cout << "Przenoszenie sie udalo" << endl; break; } else cout << "BLAD" << endl; break; } case 'U': { cout << "Czy jestes pewny? Tej operacji nie da sie odwrocic!\t [T]/[N] " << endl; cin >> wybor; if( wybor == 'T' ) { if( remove( sciezka ) ) cout << "Plik skasowany pomysle " << endl; else cout << "Nie udalo sie skasowac pliku" << endl; } break; } } } while( !( wybor == 'E' ) ); }
Kod działa, ale czy można go jakoś uprości? W sensie żeby był bardziej czytelny - jeśli nie jest, jak zrobić tak, by taki był? Co poprawić?
PS.
Czy można użyć zmiennej string zamiast tablicy char przy wpisywaniu ścieżki dostępu? |
|
jsc |
» 2013-04-06 12:32:18 Ja bym zrobił coś takiego map <string, (*void) (void)> menu;
Czyli menu jako mapę wskażników na funkcje indeksowaną na stringi. |
|
pekfos |
» 2013-04-06 12:45:49 Chyba raczej std::map < std::string, void( * )() > menu |
|
jsc |
» 2013-04-06 19:57:21 A rzeczywiście. |
|
unimator |
» 2013-04-06 22:12:18 Kod działa, ale czy można go jakoś uprości? W sensie żeby był bardziej czytelny - jeśli nie jest, jak zrobić tak, by taki był? Co poprawić?
|
Można podzielić go na funkcję zamiast wciskać wszystko do jednego switcha, a te porozrzucać do różnych plików modułowych (chociaż przy tak prostym programie nie jest to potrzebne, wystarczy podział na funkcję). Przykład: #include <iostream> #include <fstream> #include <string> #include <windows.h>
using namespace std;
void menu() { cout << "Jakie chcesz podjac dzialanie?" << endl; cout << "\n[O]tworz plik" << endl; cout << "[Z]mien nazwe" << endl; cout << "[K]opiuj plik" << endl; cout << "[U]sun plik" << endl; cout << "[P]rzenies plik" << endl; cout << "[E]XIT " << endl; }
void file_rename( char *, char * );
int main() { char sciezka[ MAX_PATH ]; char wybor, t; char nowa_sciezka[ MAX_PATH ]; string linia; cout << "Podaj sciezke pliku" << endl; cin >> sciezka; menu(); do { cin >> wybor; switch( wybor ) { case 'O': { ifstream plik( sciezka ); if( plik.good() ) { cout << "Wczytywanie sie powiodlo\n\nWypisac zawartosc? [t]/[n]" << endl; cin >> t; if( t == 't' ) { while( getline( plik, linia ) ) cout << linia << endl; } } else cout << "BLAD"; break; } case 'Z': file_rename( sciezka, nowa_sciezka ); break; case 'K': { cout << "Podaj nowa sciezke" << endl; cin >> nowa_sciezka; if( CopyFileA( sciezka, nowa_sciezka, false ) ) { cout << "Kopiowanie sie powiodlo!" << endl; break; } else { cout << "BLAD" << endl; break; } } case 'P': { cout << "Podaj gdzie przeniesc plik(sciezke dostepu)" << endl; cin >> nowa_sciezka; if( MoveFileA( sciezka, nowa_sciezka ) ) { cout << "Przenoszenie sie udalo" << endl; break; } else cout << "BLAD" << endl; break; } case 'U': { cout << "Czy jestes pewny? Tej operacji nie da sie odwrocic!\t [T]/[N] " << endl; cin >> wybor; if( wybor == 'T' ) { if( remove( sciezka ) ) cout << "Plik skasowany pomysle " << endl; else cout << "Nie udalo sie skasowac pliku" << endl; } break; } } } while( !( wybor == 'E' ) ); return 0; }
void file_rename( char * sciezka, char * nowa_sciezka ) { cout << "Podaj nowa nazwe pliku wraz z sciezka dostepu." << endl; cin >> nowa_sciezka; rename( sciezka, nowa_sciezka ); }
|
|
« 1 » |