Operacje na plikach w języku C++

Na poprzednich zajęciach dokonaliśmy przekształcenia pliku słownika esperancko-polskiego w plik tekstowy, który zawiera same rzeczowniki w języku polskim. Dzięki 100% regularności języka esperanto operacja ta przebiegła gładko. Plik wynikowy:
 

data.txt

 

Został dodatkowo przekonwertowany na duże litery w systemie Latin II, który używa konsola Windows do wyświetlania polskich znaków. Fragment tego pliku wygląda następująco:

 

PRZYMIOTNIK
AARON
ABADDON
ABAŻUREK
ABAŻUR
LICZYDŁO
ABAKUS
ABAK
ABAKUS
BIOT
ABANDON
PORZUCENIE
OPUSZCZENIE
OPACTWO
OPACTWO

 

Napiszemy teraz program, który odczyta zawartość pliku data.txt i umieści ją w dynamicznej tablicy łańcuchów znakowych. Musimy tutaj rozwiązać kilka problemów:

Nie znamy liczby wyrazów w pliku. Lepiej nie zakładać jakiejś określonej wartości, ponieważ dane mają to do siebie, że lubią się zmieniać. A nóż będziemy chcieli coś dodać lub usunąć. Zatem program powinien podjąć taką strategię

Utwórz nowy projekt konsoli i skopiuj do niego pliki:

 
newconio.cpp  -  plik źródłowy biblioteki
newconio.h  - plik nagłówkowy dla biblioteki

 

Dodaj te pliki do projektu (Project → Add files...).

 
// Odczyt pliku tekstowego do tablicy dynamicznej
//-----------------------------------------------

#include <iostream>
#include <fstream>
#include <cstring>
#include "newconio.h"

using namespace std;

// Klasa łańcuchów tekstowych
//-----------------------------
class Tstring
{
  private:
    char **c;     // wskaźnik do tablicy wskaźników
    int n;        // rozmiar tablicy
    int last;     // numer ostatniego wpisu
  public:
    Tstring();    // konstruktor
    ~Tstring();   // destruktor
    void print(); // wyświetla zawartość tablicy
};

// Konstruktor
//------------
Tstring::Tstring()
{
  char buf[1000];
  int i;
  ifstream infile("data.txt");

  last = n = 0;
  c = NULL;
  for(i = 0; infile.good(); i++)
  {
    infile >> buf;
    if(buf[0])
    {
      if(last == n)
      {
         char ** t = new char * [n + 100];
         for(int j = 0; j < n; j++) t[j] = c[j];
         delete [] c;
         c = t;
         n += 100;
      }
      c[last] = new char [strlen(buf) + 1];
      strcpy(c[last++],buf);
    }
    buf[0] = 0;
  }
  infile.close();
}

// Wyświetla testowo zawartość tablicy
//------------------------------------
void Tstring::print()
{
  int i;

  for(i = 0; i < last; i++) cout << c[i] << endl;
}

// Destruktor
//-----------
Tstring::~Tstring()
{
  int i;
  for(i = 0; i < last; i++) delete [] c[i];
  delete [] c;
}

int main()
{
  _cinit();

  textcolor(LIGHTGREEN);
  clrscr();

  Tstring V;     // Słownik

  V.print();     // Test zawartości

  textcolor(WHITE);
  cout << endl << "Koniec danych..." << endl;
  textcolor(7);

  return 0;
}

 

W dalszej części zajęć napiszemy prostą grę logiczną w odgadywanie wyrazów. Gra będzie przebiegała wg następujących reguł:

 

Program pierwszy odpowiednio rozbudowujemy, dodając do obiektu Tstring nowe funkcje składowe, które obsługują przebieg gry.

 

// Zgadywanka
//-----------

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <ctime>

#include "newconio.h"

using namespace std;

// Klasa łańcuchów tekstowych
//-----------------------------
class Tstring
{
  private:
    char **c;        // wskaźnik do tablicy wskaźników
    int n;           // rozmiar tablicy
    int last;        // numer ostatniego wpisu
  public:
    Tstring();       // konstruktor
    ~Tstring();      // destruktor
    void print();    // wyświetla zawartość tablicy
    void play();     // rozgrywka
};

// Konstruktor
//------------
Tstring::Tstring()
{
  char buf[1000];
  int i;
  ifstream infile("data.txt");

  last = n = 0;
  c = NULL;
  for(i = 0; infile.good(); i++)
  {
    infile >> buf;
    if(buf[0])
    {
      if(last == n)
      {
         char ** t = new char * [n + 100];
         for(int j = 0; j < n; j++) t[j] = c[j];
         delete [] c;
         c = t;
         n += 100;
      }
      c[last] = new char [strlen(buf) + 1];
      strcpy(c[last++],buf);
    }
    buf[0] = 0;
  }
  infile.close();
}

// Wyświetla testowo zawartość tablicy
//------------------------------------
void Tstring::print()
{
  int i;

  for(i = 0; i < last; i++) cout << c[i] << endl;
}

// Rozgrywka
//----------
void Tstring::play()
{
  char hword[100], uword[100], sword[100];
  int i,j,k,hlen,ulen;

  srand(time(NULL));     // Inicjujemy generator pseudolosowy
  memset(hword,0,100);   // Zerujemy bufor
  strcpy(hword,c[(rand() + (rand() << 15)) % last]);  // Losujemy słowo
  hlen = strlen(hword);  // Obliczamy długość słowa

  clrscr();

  ulen = uword[0] = 0;

  for(i = 1; i <= 7; i++)
  {
    textcolor(LIGHTGREEN);
    cout << "RUNDA NR ";
    textcolor(YELLOW);
    cout << i << endl;
    for(j = 0; j < hlen; j++) sword[j] = '*';
    sword[j] = 0;
    for(j = 0; j < ulen; j++)
      if(uword[j] == hword[j])
        for(k = 0; k < hlen; k++)
          if(hword[k] == uword[j]) sword[k] = uword[j];
    textcolor(WHITE);
    cout << sword << endl;
    cin >> uword;
    cout << endl;
    ulen = strlen(uword);
    if(!strcmp(hword,uword))
    {
        textcolor(CYAN);
        cout << "*** GRATULACJE ***" << endl;
        break;
    }
    if(i == 7)
    {
        textcolor(LIGHTRED);
        cout << _pl("*** Przegrałeś - nie odgadłeś hasła ***") << endl << endl;
        textcolor(YELLOW);
        cout << hword << endl << endl;
    }
  }
  textcolor(7);
}

// Destruktor
//-----------
Tstring::~Tstring()
{
  int i;
  for(i = 0; i < last; i++) delete [] c[i];
  delete [] c;
}

int main()
{
  _cinit();

  Tstring V;     // Słownik

  V.play();      // Gra

  return 0;
}

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2024 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe