Witam.
Posiadam aplikację, która przetwarza plik zawierający kilka rekordów (plik tekstowy *.txt).
Poniżej kod wspomnianego programu:
#include <fstream>
#include <iostream>
#include <string>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
using namespace std;
int main()
{
char odczyt[99];
char zapis[99];
cout<<"Wczytaj z: \n";
cin>>odczyt;
cout<<"Zapisz do: \n";
cin>>zapis;
fstream plik (odczyt, ios::in);
system("cls");
string line;
string TPITI[99],SEMOV[99],CDMAG[99],MODAM[99],TELAC[99],DESCL[99],TPASS[99],DESAS[99],VINNO[99],MZZTR[99],NTORB[99],LNPRD[99],ORPTY[99],NRPRG[99],DAPCN[99],LPCAR[99],CDCOL[99],CDCLM[99],DTBLE,TIME;
string HEADR,HDRTPITI,HDRNTRAS,HDRNRECO,HDRCDMAG,HDRMITTE,HDRDTTRX,HDRORTRX;
time_t rawtime;
struct tm * timeinfo;
char buffer [80];
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80,"%Y%m%d%H%M%S",timeinfo);
string data(buffer);
string nowa;
DTBLE=data.substr(2,6);
TIME=data.substr(8,6);
int licznik=0,rekordy=0;
int IleRekordow=0;
cout<<"Wpisz liczbe rekordow w pliku: ";
cin>>IleRekordow;
int i;
string Rekord[99];
string wynik[99];
string wynik2[99];
while(!plik.eof())
{
//rekordy=rekordy+1;
getline(plik, HEADR);
//cout<<"\n"<<HEADR<<"\n";
HDRTPITI=HEADR.substr(0,3);
HDRNTRAS=HEADR.substr(3,5);
HDRNRECO=HEADR.substr(8,5);
HDRCDMAG=HEADR.substr(13,2);
HDRMITTE=HEADR.substr(15,15);
HDRDTTRX=HEADR.substr(30,6);
HDRORTRX=HEADR.substr(36,6);
for (int i=0;i<IleRekordow;i++){
getline(plik, Rekord[i]);
licznik=licznik+2;
//cout<<Rekord[i]<<"\n";
TPITI[i]=Rekord[i].substr(0,3);
SEMOV[i]=Rekord[i].substr(3,1);
CDMAG[i]=Rekord[i].substr(4,2);
MODAM[i]=Rekord[i].substr(6,15);
TELAC[i]=Rekord[i].substr(21,6);
DESCL[i]=Rekord[i].substr(27,40);
TPASS[i]=Rekord[i].substr(67,1);
DESAS[i]=Rekord[i].substr(68,30);
VINNO[i]=Rekord[i].substr(98,17);
MZZTR[i]=Rekord[i].substr(115,4);
NTORB[i]=Rekord[i].substr(119,1);
LNPRD[i]=Rekord[i].substr(120,1);
ORPTY[i]=Rekord[i].substr(121,1);
NRPRG[i]=Rekord[i].substr(122,7);
DAPCN[i]=Rekord[i].substr(129,6);
LPCAR[i]=Rekord[i].substr(135,2);
CDCOL[i]=Rekord[i].substr(137,3);
CDCLM[i]=Rekord[i].substr(140,3);
wynik[i]="022"+SEMOV[i]+CDMAG[i]+VINNO[i]+DTBLE+LNPRD[i]+NRPRG[i]+"\n";
wynik2[i]="060"+SEMOV[i]+CDMAG[i]+MODAM[i]+TELAC[i]+DTBLE+"0"+HDRNTRAS+" "+VINNO[i]+LNPRD[i]+" "+NRPRG[i]+"\n";
}
}
fstream plik2 (zapis, ios::out);
plik2<<HDRTPITI<<HDRNTRAS<<"0000"<<licznik+1<<" CAT2W "<<DTBLE<<TIME<<"\n";
for (int i=0;i<IleRekordow;i++){
//cout<<wynik[i];
plik2<<wynik[i];
}
for (int i=0;i<IleRekordow;i++){
//cout<<wynik2[i];
plik2<<wynik2[i];
}
}
Potrzebuje przerobić go tak, aby otwierając plik wpierw liczył ile jest w nim rekordów (każda następna linia poza pierwsza (tzw. header)). Próbowałem przerobić go tak, aby wpisywać "z łapy" ilość rekordów (zresztą umieściłem to w kodzie powyżej), ale jeśli plik zawiera więcej jak 4 rekordy program wyskakuje z błędem, którego nie umiem odnaleźć.
Kolejnym problemem jest wygenerowanie nazwy pliku wyjściowego, która musi składać się ze zmiennych składowych wczytanych z linii 1 (header).
Pomożecie mi z tym ?