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

[C++] Obsługa pliku przy pomocy fstream

Ostatnio zmodyfikowano 2013-04-06 22:12
Autor Wiadomość
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
C/C++
//Kopiowanie, przenoszenie, usuwanie, zmienianie nazwy
#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;
                       
                    }
                } //if
                else
                     cout << "BLAD";
               
                break;
            } //case
        case 'Z':
            {
                cout << "Podaj nowa nazwe pliku wraz z sciezka dostepu." << endl;
                cin >> nowa_sciezka;
                rename( sciezka, nowa_sciezka );
                break;
            } //case
        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
        case 'P':
            {
                cout << "Podaj gdzie przeniesc plik(sciezke dostepu)" << endl;
                cin >> nowa_sciezka;
                if( MoveFileA( sciezka, nowa_sciezka ) )
                {
                    cout << "Przenoszenie sie udalo" << endl;
                    break;
                } //if
                else
                     cout << "BLAD" << endl;
               
                break;
            } //case
        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;
            } //case
        } //switch
       
    } 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?
P-80037
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.
P-80039
pekfos
» 2013-04-06 12:45:49
Chyba raczej
std::map < std::string, void( * )() > menu
P-80041
jsc
» 2013-04-06 19:57:21
A rzeczywiście.
P-80101
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:
C/C++
//Kopiowanie, przenoszenie, usuwanie, zmienianie nazwy
#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 * ); //Funkcja file_rename jest odpowiedzialna za zmiane nazwy pliku, przyjmuje dwa parametry: pierwotna nazwe pliku i nowa nazwe. Na dole jest jej definicja.

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;
                       
                    }
                } //if
                else
                     cout << "BLAD";
               
                break;
            } //case
        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
        case 'P':
            {
                cout << "Podaj gdzie przeniesc plik(sciezke dostepu)" << endl;
                cin >> nowa_sciezka;
                if( MoveFileA( sciezka, nowa_sciezka ) )
                {
                    cout << "Przenoszenie sie udalo" << endl;
                    break;
                } //if
                else
                     cout << "BLAD" << endl;
               
                break;
            } //case
        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;
            } //case
        } //switch
       
    } while( !( wybor == 'E' ) );
   
    return 0; //Funkcja main zwraca int (w deklaracji) więc warto użyć return :) taka "drobnostka".
}

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 );
}
P-80111
« 1 »
  Strona 1 z 1