Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zamiana znakow w pliku, jezyk c++

04 Lut 2010 10:14 6371 8
  • Poziom 9  
    Prosze o pomoc w napisaniu funkcji w jezyku C++, ktora bedzie odczytywala plik i zamieniala "," na ".".
    Jestem poczatkujacym programista.

    Code:
    void zamiana()
    
    {
        fstream plik;
        plik.open("przecinek.txt", ios::in | ios::out);

        if (plik.good()== true)
        {
            //opercja na pliku
            cout << "Uzyskano dostep do pliku" << endl;
        }
        else
        {
            cout << "Nie udalo sie uzyskac dostepu do pliku";
        }
    plik.close();
    }


    Jak powinno wygladac cialo funkcji w miejscu gdzie jest komentarz operacja na pliku?

    Proszę poprawić pisownię.
    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • Poziom 13  
    Zmodyfikuj sobie ten kod:
    Code:

    #include "stdafx.h"
    #include <string>
    #include <fstream>
    using namespace std;


    int _tmain(int argc, _TCHAR* argv[])

      ifstream in("Scopy.cpp"); // Open for reading
      ofstream out("Scopy2.cpp"); // Open for writing
      string wyn, dod, s, c, sp;
      int i, j, k ,l;
      c=" ";
      while(getline(in, s))     // Discards newline char
      {
               wyn="";
               for (i=1; i<s.length(); i++)
          {
                            if s[i]==","
                            {
                                 s[i]=".";
                            }
             wyn=wyn+s[i];
          };
          out << wyn << "\n";
      };
      return 0;
    } ///:~


    Szybko przerabiałem więc może być jakiś czeski błąd :)
  • Poziom 9  
    Dziekuje za odpowiedz!
    Przerobilem program do tej postaci:
    Code:
    void zamiana()
    
    {
        ifstream in("przecinek.txt");
        ofstream out("przecinek2.txt");

        string wynik, s;
        unsigned int i;

        while (getline(in, s))
        {
            wynik = "";
            for (i = 0 ; i < s.length(); i++)
            {
                if (s[i] == ',')
                {
                    s[i] = '.';
                }
                wynik = wynik + s[i];
            }

            out << wynik <<endl;

        }
    }

    Prosilbym jednak kogos o wyjasnienie mi jak w tej funkcji dziala funkcja getline()...
  • Poziom 14  
    Sugerowałbym podejść do tego tak:

    Code:

    #include <fstream>
    #include <iostream>

    using namespace std;

    void zamiana()
    {
            fstream plik, plik2;
            plik.open("przecinek.txt", ios::in);
            plik2.open("kropka.txt", ios::out);

            if (plik.good() && plik2.good())
            {
                    cout << "Uzyskano dostep do pliku" << endl;
                    char c;
                    while(plik.get(c)) {
                            if(c == ',')
                                    c = '.';
                            plik2 << c;
                    }
            }
            else
            {
                    cout << "Nie udalo sie uzyskac dostepu do pliku";
            }
            plik.close();
            plik2.close();
    }

    int main(void) {
            zamiana();
    }


  • Poziom 9  
    Serdecznie dziekuje za pomoc, ponizej dodalem opis do poszczegolnych momentow w programie, prosze mnie poprawic jesli gdzies sie pomylilem.
    szczegolnie chodzi mi o petle while(czy dobrze ja zrozumialem?)

    Code:
    void zamiana()
    
    {
        fstream plik1, plik2; // Tworze 2 obiekty klasy fstream

        plik1.open("przecinek.txt", ios::in); //otwieram plik1 tylko do odczytu
        plik2.open("przecinek2.txt", ios::out); // otwieram plik2 do zapisu


        if (plik1.good() && plik2.good())  // sprawdzenie czy pliki otwarly sie prawidlowo
        {
            char c;                        // definicja zmiennej c;

            while (plik1.get(c))           //get() wyjmuje ze strumienia 1 bajt i umieszcza go w zmiennej c, nastepnie dopoki nie wystapi
            {
                if (c == ',') c = '.';     // koniec pliku bedzie nastepowala zamiana , na .

                plik2 << c;

            }

        }
        else
        {
            cout << "Nie udalo sie uzyskac dostepu do pliku" << endl;
        }

        plik1.close();
        plik2.close();
    }


    Proszę poprawić pisownię we wszystkich postach. - arnoldziq

    Dodano po 1 [godziny] 14 [minuty]:

    Dodalemm do powyzszego programu kilka lini, program wyglada nastepujaco:
    Code:
    void zamiana(char *sciezka_plik)
    
    {
        fstream plik1, plik2; // Tworze 2 obiekty klasy fstream
        string a(sciezka_plik);
        string b("copy");
        string d = a+b;

        plik1.open(a, ios::in);   //otwieram plik1 tylko do odczytu

        plik2.open(d, ios::out); // otwieram plik2 do zapisu


        if (plik1.good() && plik2.good())       // sprawdzenie czy pliki otwarly sie prawidlowo
        {
            char c;                             // definicja zmiennej c;

            while (plik1.get(c))                //get() wyjmuje ze strumienia 1 bajt i umieszcza go w zmiennej c, nastepnie dopoki nie wystapi
            {
                if (c == ',') c = '.';          // koniec pliku bedzie nastepowala zamiana , na .

                plik2 <<c;
            }


        }
        else
        {
            cout << "Nie udalo sie uzyskac dostepu do pliku" << endl;
        }

        plik1.close();
        plik2.close();


    }


    chcialbym, zeby nazwa byla pliku byla argumentem funkcji, nastepnie by plik juz po zamianie , na . zqpisywany byl pod ta sama nazwa z dodana koncowka "copy". Zrobilem to dopisujac ponizsze linijki:
    fstream plik1, plik2; // Tworze 2 obiekty klasy fstream
    Code:
    string a(sciezka_plik);
    
        string b("copy");
        string d = a+b;

        plik1.open(a, ios::in);   //otwieram plik1 tylko do odczytu

        plik2.open(d, ios::out); // otwieram plik2 do zapisu


    Jednak funkcja nie dziala, prosilbym o podpowiedz co tu jest nie tak...
  • Poziom 18  
    Koledzy,
    Prezentowane przez Was rozwiązania - niewątpliwie skuteczne - nie są jednak napisane w stylu C++. Programista, który nie uczył się C, zrobiłby to tak:
    Code:
    int main(){
    
      ifstream in("przecinek.txt");
      ostringstream ss;
      ss << in.rdbuf();
     
      string s;
      s = ss.str();
     
      replace( s.begin(), s.end(), ',', '.' );
     
      ofstream out("przecinek2.txt");
      out << s;

      return 0; 
    }

    W kodzie celowo pomijam sprawdzanie, czy pliki się otwarły, bo nie jest ono konieczne, jeżeli program służy tylko do takiej zamiany. Gdyby było potrzebne, może wyglądać tak:
    Code:
      if( !in ){
    
        cerr << "Błąd otwarcia pliku do odczytu" << endl;
        exit(1);
      }

    Oczywiście, przed kodem trzeba załączyć wszystkie konieczne nagłówki.

    HTH,
    Dariusz
  • Poziom 9  
    Ponawiam pytanko, mam taka czesc kodu.
    Code:
    fstream plik1, plik2; // Tworze 2 obiekty klasy fstream
    

    // automatyczne dodawanie koncowki _copy przed rozszerzeniem pliku
        string a;
        a = sciezka_plik;

        string::size_type pozycja;

        pozycja = a.find_first_of(".");

        cout << "Kropka jest na pozycji " << pozycja << endl;
        string b ("_copy");

        string d;

        d = a.insert(pozycja, b);

        cout << " Plik " << a << " ma teraz nazwe: " << d;

       

        plik1.open(sciezka_plik, ios::in);   //otwieram plik1 tylko do odczytu

        plik2.open(d, ios::out);



    Najpierw zamieniam c-string na string i umieszczam go w zmiennej a, nastepnie sprawdzam gdzie jest kropka ".". jak joz wiem gdzie sie ona znajduje to przed nia dodaje _copy. Teraz mam kolejnego stringa d, ktory rozni sie od sciezka_plik tym , ze jest tam _copy przed ".". Chce go wrzucic w miejsce plik.open(d.... i wywal mi blad, ze to zly typ...
    Jak zamienic tego stringa na char by mozna bylo odpalic te funkcje?
  • Poziom 20  
    Code:
    string napis ="abc...123..."; // string napis ma jakąś wartość
    
    napis.c_str(); // metoda c_str() przekształca napis na c-string

    - to napisane w dużym "skrócie" powinno Ci wyjaśnić problem.
  • Poziom 9  
    Serdecznie dziekuje za odpowiedz. Po przerobce fragment programu wyglada nastepujaco:

    Code:
    fstream plik1, plik2; // Tworze 2 obiekty klasy fstream
    

            // automatyczne dodawanie koncowki _2 przed rozszerzeniem pliku
        string a;
        a = sciezka_plik;

        string::size_type pozycja;
        pozycja = a.find_first_of(".");                         // szukanie, na ktorej pozycji jest kropka

        string b ("_2");                                     // tworze nowego stringa

        a.insert(pozycja, b);                                   // dopisuje koncowke _copy do stringa jaki miesci sie w zmiennej a

        plik1.open(sciezka_plik, ios::in);                      //otwieram plik1 tylko do odczytu
        plik2.open(a.c_str(), ios::out);   



    Ponizej cala funkcja zamiany "," na ".":

    Code:
    //Zamiana przecinkow na kropki
    
    void zamiana(char *sciezka_plik)
    {
        fstream plik1, plik2; // Tworze 2 obiekty klasy fstream

            // automatyczne dodawanie koncowki _2 przed rozszerzeniem pliku
        string a;
        a = sciezka_plik;

        string::size_type pozycja;
        pozycja = a.find_first_of(".");                         // szukanie, na ktorej pozycji jest kropka

        string b ("_2");                                     // tworze nowego stringa

        a.insert(pozycja, b);                                   // dopisuje koncowke _copy do stringa jaki miesci sie w zmiennej a

        plik1.open(sciezka_plik, ios::in);                      //otwieram plik1 tylko do odczytu
        plik2.open(a.c_str(), ios::out);                        // otwieram plik2 do zapisu, d.c_str() zamienia string w c-string

        if (plik1.good() && plik2.good())                       // sprawdzenie czy pliki otwarly sie prawidlowo
        {
            char c;                                             // definicja zmiennej c;

            while (plik1.get(c))                                //get() wyjmuje ze strumienia 1 bajt i umieszcza go w zmiennej c, nastepnie dopoki nie wystapi
            {
                if (c == ',') c = '.';                          // koniec pliku bedzie nastepowala zamiana , na .

                plik2 <<c;
            }

        }
        else
        {
            cout << "Nie udalo sie uzyskac dostepu do pliku" << endl;
        }

        plik1.close();
        plik2.close();

    }