Przetwarzanie pliku tekstowego

0

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 ?

0

Wiem, że słabo napisane, ale robiłem to na szybko, aby działało...

0

mmmmmmmmmmmm ammmmmmmmmmmmm hmmmmmmmmmmmmmm

user image

Napisz zalozenia w punkcie co chcesz zrobic (punkt NIE moze zawierac lacznikow typu i, oraz, takze, itd)
Kazde zalozenie to jedna funkcja
wtedy pytaj o konkrety. Nikt Ci tego nie bedzie sprawdzal.

0

To jest do wywalenia i napisania od nowa. Nie da się tego analizować ani modyfikować. Może przedstaw tutaj format pliku który czytasz i podaj przykładową zawartość. Znajdzie się pewnie ktoś, kto doradzi jak to czytelniej można zrobić.

0

Już podaje.
plik wejściowy składa się z tzw. headera oraz rekordów (które zaczynają się od 030+, albo 013+, wielkość tych dwóch typów rekordu jest różna)
Oto przykład:

HDR0024200017C2SMP            150505130959
030+C2DF2.5S         426729PORTABLE FUN CZARNY  (XXXXX)(XXX)       Xxxxxx                         00252F-426729    0000 OA0000227150510C20EP   DF2.5S
  • każdy rekord ma być przetworzony na 2 linijki (zaczynające się od 022 oraz 060)

  • plik wyjściowy ma mieć także swój header, zrobiony na podstawie pliku wejściowego

  • rekordy przetworzone mają być wrzucone do drugiego pliku

  • jeśli rekordów jest więcej jak 1, plik wyjściowy ma wpierw zaczynać się od linijek rozpoczętych od 022, dopiero 060, przykład

HEADER
022+rekord+1
022+rekord+2
060+rekord+1
060+rekord+2
...

nazwa pliku wyjściowego ma się składać także ze składowych w pliku wejściowym

Rekord 030+ dzieli się na takie zmienne:
TPITI = 3 znaki
SEMOV = 1 znak
CDMAG = 2 znaki
MODAM = 15 znaków
TELAC = 6 znaków
DESCL = 40 znaków
TPASS = 1 znak
DESAS = 30 znaków
VINNO = 17 znaków
MZZTR = 4 znak
NTORB = 1 znak
LNPRD = 1 znak
ORPTY = 1 znak
NRPRG = 7 znaków
DAPCN = 6 znaków
LPCAR = 2 znaki
CDCOL = 3 znaki
CDCLM = 3 znaki

header natomiast składa się ze zmiennych
TPITI = 3 znaki
NTRAS = 5 znaków
NRECO = 5 znaków
CDMAG = 2 znaki
MITTE = 15 znaków
DTTRX = 6 znaków (data w formacie YYMMDD, pobierana z systemu)
ORTRX = 6 znaków (czas w formacie HHMMSS, pobierany z systemu)

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