Operacje na plikach

Odpowiedz Nowy wątek
2009-06-17 00:18

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

0

Witam,

Mam do napisania program symulujący dużego lotka. Generalnie użytkownik ma możliwość wprowadzenia kuponu. Kupon składa się z nazwiska, N zakładów, a każdy zakład to 6 liczb. Każdy z kuponów powinien być zapisywany jako osobny plik. Nie potrafię tylko zrobić, by nazwę pliku dodawać z automatu dla kuponu. Zrobiłem jedynie, że przed wprowadzeniem danych do kuponu użytkownik podaje nazwę pliku. Potem oczywiście muszę wylosować jakieś 6 liczb, no i porównać z każdym z plików by wyłonić ewentualnych zwycięzców. Ale jeśli pozostawię to w takiej formie jak jest teraz, to przy otwieraniu znowu będę musiał podać nazwy każdego pliku ręcznie. Tyle, że przy jednym uruchomieniu programu, może być tych kuponów 2, a innym razem 20... Jest niby coś takiego jak readdir co czyta cały katalog, tyle tylko, że ja póki co zrobiłem to tak, że pliki się tworzą w tym samym katalogu co mam pliki .cpp i .exe, więc prawdopodobnie je też by to przeczytał. Jak zrobić by te pliki tekstowe tworzyć w osobnym katalogu. No i czy jest jakiś prostszy sposób przeczytania tego niż readdir, bo tego na razie nie potrafię rozgryźć? Prawdę mówiąc na wykładach takie rzeczy nie były omawiane...

Poniżej mój kod, gdzie wczytuje kupon z podaniem nazwy pliku:

#include <iostream>
#include <iomanip>
#include <fstream>
#define N 20
using namespace std;

struct kupon
{
       int liczby[6];
};

struct glowna
{
       int ile_zakladow;
       char nazwisko[30];
       kupon a;
};

void wczytaj (glowna p[], ifstream &plik2, ofstream &plik);
string nazwa;
int main()
{
ofstream plik;
ifstream plik2;
glowna tab[N];
      cout<<"Podaj nazwe pliku(format: numer.txt gdzie \"numer\" to kolejna liczba zaczynajac od 1, a konczac na 20)\n";
      cin>>nazwa;
      wczytaj(tab, plik2, plik);
      system("Pause");
}

void wczytaj (glowna p[], ifstream &plik2, ofstream &plik)
{
     plik.open(nazwa.c_str(), ios::out);
     cout<<"Podaj liczbe zakladow, ktore chcesz zagrac\n";
     cin>>p[0].ile_zakladow;
     plik <<p[0].ile_zakladow<<endl;
     plik2.open(nazwa.c_str(), ios::in);
     plik2 >> p[0].ile_zakladow;
     int zm=p[0].ile_zakladow;
     cout<<"ilosc wybranych zakladow: "<<zm<<endl;    
     for (int i=0; i<zm; i++)
     {      
        cout<<"Wypelnij "<<i+1<<" zaklad, wpisujac kolejno nazwisko, a potem 6 liczb z zakresu <1,49>\n";
        cout<<"Podaj nazwisko"<<endl;
        cin.get();
        cin.getline(p[i].nazwisko, 30);
        plik <<p[i].nazwisko<<endl;
        for (int j=0; j<6; j++)
        {
            do{
            cout<<"Podaj "<<j+1<<" liczbe: __\b\b";
            cin>>p[i].a.liczby[j];
            if (p[i].a.liczby[j]<1 || p[i].a.liczby[j]>49)
            {
              cout<<"Przekroczono zakres. Dostepne liczby z zakresu <1,49>\n Wpisz jeszcze raz\n";
            }
              }while(p[i].a.liczby[j]<1 || p[i].a.liczby[j]>49);
        }

        for (int k=0; k<6; k++)
        {
            plik<<p[i].a.liczby[k]<<endl;
        }
     }
     plik2.close();
     plik.close();
}

Pozostało 580 znaków

2009-06-17 22:23

Rejestracja: 15 lat temu

Ostatnio: 3 lata temu

0

Możesz zastosować funkcje API Windows :

FindFirstFile http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx
FindNextFile http://msdn.microsoft.com/en-us/library/aa364428(VS.85).aspx


---

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0