porządek w kodzie - pomóżcie

0

Potrzebuje waszej pomocy w kodzie, gdyż będę chciał dodać kilka podobnych funkcji, a już mi się wszystko zaczyna mieszać. Oto kod:

#include <fstream>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <utility>
#include <string>
#include <stdio.h>
#include <time.h>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <Windows.h>

using namespace std;

pair<string, string> czas() {
  string DTBLE, TIME;
  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);

  return make_pair(DTBLE, TIME);
}

int main() {
  HANDLE kolor;
  string line;
  string TPITI[99], SEMOV[99], CDMAG[99], MODAM[99], TELAC[99], FIL10[99],
      CNTER[99], NRVEN[99], COLLO[99], CDCOL[99], DESC1[99], DTMER[99],
      VINNO[99], DADOC[99], CCAMTA[99];
  string PREIM[99], FLCEE[99], ENGIN[99], LNPRD[99], CDFOA[99], SRCAR[99],
      PESLO[99], CDCLM[99], INSAM[99], FREAM[99], PESNE[99], LPCAR[99],
      MZZTR[99], ORPTY[99], CCAMTB[99];
  string DESCL[99], NTORB[99], CDMA2[99], CDCLI[99], NRIND[99], RAIND[99],
      ININD[99], CAIND[99], LOIND[99], PRIND[99], CDNAZ[99], CDCL2[99],
      DESAS[99], DOGAN[99];
  string NRIN2[99], RAIN2[99], ININ2[99], CAIN2[99], LOIN2[99], PRIN2[99],
      CDNA2[99], ASVEF[99], I2IND[99], I2IN2[99], RRQNR[99], RRQDT[99],
      OUTFL[99], CCAMT[99];
  string NORSD[99], DTCOC[99], LPCUS[99], VECST[99], MODPV[99], DORSD[99],
      CDVAL[99], NRPRG[99], NRFTF[99], TPASS[99], DAPCN[99], DABOG[99],
      NRBOG[99];
  string HEADER, HEADR, HDRTPITI, HDRNTRAS, HDRNRECO, HDRCDMAG, HDRMITTE,
      HDRDTTRX, HDRORTRX;
  string Rekord[99], wynik[99], wynikUZP[99], wynik2[99], wynik3[99], UZUPEL,
      nazwa, typ;
  int rekordy = 0, koniec = 0, i = 0, linie = 0, ile = 0, ile2 = 0, loop = 0,
      loop2 = 0, licznik = 0, uzup = 15;

  kolor = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(kolor, 10);

  // char odczyt[99];
  // cout<<"Plik: ";
  // cin>>odczyt;

  fstream plik("in.txt", ios::in);
  pair<string, string> bar = czas();

  do {
    getline(plik, line);
    linie = linie + 1;
  } while (!plik.eof());
  plik.close();

  typ = line.substr(0, 4);

  if (typ == "010+") {
    rekordy = linie - 1;
    fstream plik3("in.txt", ios::in);
    while (!plik3.eof()) {
      getline(plik3, HEADR);
      HDRTPITI = 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);

      nazwa = "CAT" + HDRTPITI + ".txt";

      for (int i = 0; i < rekordy; i++) {
        getline(plik3, Rekord[i]);
        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);
        FIL10[i] = Rekord[i].substr(27, 13);
        CNTER[i] = Rekord[i].substr(40, 12);
        NRVEN[i] = Rekord[i].substr(52, 10);
        COLLO[i] = Rekord[i].substr(62, 6);
        CDCOL[i] = Rekord[i].substr(68, 3);
        DESC1[i] = Rekord[i].substr(71, 15);
        VINNO[i] = Rekord[i].substr(92, 17);
        NRFTF[i] = Rekord[i].substr(115, 11);
        CDVAL[i] = Rekord[i].substr(126, 3);
        PREIM[i] = Rekord[i].substr(129, 11);
        FLCEE[i] = Rekord[i].substr(140, 1);
        ENGIN[i] = Rekord[i].substr(141, 18);
        LNPRD[i] = Rekord[i].substr(159, 1);
        CDFOA[i] = Rekord[i].substr(160, 6);
        SRCAR[i] = Rekord[i].substr(166, 1);
        PESLO[i] = Rekord[i].substr(167, 7);
        CDCLM[i] = Rekord[i].substr(174, 3);
        INSAM[i] = Rekord[i].substr(177, 17);
        FREAM[i] = Rekord[i].substr(194, 17);
        PESNE[i] = Rekord[i].substr(211, 7);
        wynik[i] = "040" + SEMOV[i] + CDMAG[i] + MODAM[i] + TELAC[i] +
                   bar.first + "      " + bar.first + VINNO[i] + LNPRD[i] +
                   "      \n";
      }
      int licznik = rekordy;
      koniec = licznik + 1;
    }
    ile = (int)log10(koniec) + 1;
    loop = 5 - ile;

    const char* zapis = nazwa.c_str();

    fstream plik2(zapis, ios::out);
    plik2 << "HDR" << HDRTPITI << UZUPEL;
    for (int i = 0; i < loop; i++) {
      plik2 << "0";
    }
    plik2 << koniec << "  CAT2W          " << bar.first << bar.second << "\n";

    for (int i = 0; i < rekordy; i++) {
      plik2 << wynik[i];
    }
  }

  if (typ == "013+") {
    rekordy = linie - 1;
    fstream plik3("in.txt", ios::in);
    while (!plik3.eof()) {
      getline(plik3, HEADR);
      HDRTPITI = 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);

      nazwa = "CAT" + HDRTPITI + ".txt";

      for (int i = 0; i < rekordy; i++) {
        getline(plik3, Rekord[i]);
        TPITI[i] = Rekord[i].substr(0, 3);
        SEMOV[i] = Rekord[i].substr(3, 1);
        LNPRD[i] = Rekord[i].substr(4, 1);
        MODAM[i] = Rekord[i].substr(5, 15);
        TELAC[i] = Rekord[i].substr(20, 6);
        VINNO[i] = Rekord[i].substr(26, 17);
        DESCL[i] = Rekord[i].substr(43, 40);
        NTORB[i] = Rekord[i].substr(83, 1);
        CDMA2[i] = Rekord[i].substr(84, 2);
        CDCLI[i] = Rekord[i].substr(86, 6);
        NRIND[i] = Rekord[i].substr(92, 2);
        RAIND[i] = Rekord[i].substr(94, 35);
        ININD[i] = Rekord[i].substr(129, 35);
        CAIND[i] = Rekord[i].substr(164, 9);
        LOIND[i] = Rekord[i].substr(173, 20);
        PRIND[i] = Rekord[i].substr(193, 2);
        CDNAZ[i] = Rekord[i].substr(195, 3);
        CDMAG[i] = Rekord[i].substr(198, 2);
        CDCL2[i] = Rekord[i].substr(200, 6);
        NRIN2[i] = Rekord[i].substr(206, 2);
        RAIN2[i] = Rekord[i].substr(208, 35);
        ININ2[i] = Rekord[i].substr(243, 35);
        CAIN2[i] = Rekord[i].substr(278, 9);
        LOIN2[i] = Rekord[i].substr(287, 20);
        PRIN2[i] = Rekord[i].substr(307, 2);
        CDNA2[i] = Rekord[i].substr(309, 3);
        ASVEF[i] = Rekord[i].substr(312, 1);
        I2IND[i] = Rekord[i].substr(313, 35);
        I2IN2[i] = Rekord[i].substr(348, 35);
        RRQNR[i] = Rekord[i].substr(383, 7);
        RRQDT[i] = Rekord[i].substr(390, 10);
        OUTFL[i] = Rekord[i].substr(391, 1);
        CDCOL[i] = Rekord[i].substr(394, 3);
        CDCLM[i] = Rekord[i].substr(397, 3);
        wynik[i] = "014" + SEMOV[i] + LNPRD[i] + MODAM[i] + TELAC[i] +
                   VINNO[i] + bar.first + "        " + CDMAG[i] + CDCL2[i];
      }
      int licznik = rekordy * 1;
      koniec = licznik + 1;
    }
    ile = (int)log10(koniec) + 1;
    loop = 5 - ile;

    const char* zapis = nazwa.c_str();

    fstream plik2(zapis, ios::out);
    plik2 << "HDR" << HDRTPITI << UZUPEL;
    for (int i = 0; i < loop; i++) {
      plik2 << "0";
    }
    plik2 << koniec << "  CAT2W          " << bar.first << bar.second << "\n";

    for (int i = 0; i < rekordy; i++) {
      plik2 << wynik[i];
      plik2 << "\n";
    }
  }

  if (typ == "030+") {
    rekordy = linie - 1;
    fstream plik3("in.txt", ios::in);
    while (!plik3.eof()) {
      getline(plik3, HEADR);
      HDRTPITI = 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);

      nazwa = "CAT" + HDRTPITI + ".txt";

      for (int i = 0; i < rekordy; i++) {
        getline(plik3, Rekord[i]);
        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] + bar.first +
                   LNPRD[i] + NRPRG[i] + "\n";
        wynik2[i] = "060" + SEMOV[i] + CDMAG[i] + MODAM[i] + TELAC[i] +
                    bar.first + DAPCN[i] + "      " + VINNO[i] + LNPRD[i] +
                    "                    " + NRPRG[i] + "\n";
      }
      int licznik = rekordy * 2;
      koniec = licznik + 1;
    }
    ile = (int)log10(koniec) + 1;
    loop = 5 - ile;

    const char* zapis = nazwa.c_str();

    fstream plik2(zapis, ios::out);
    plik2 << "HDR" << HDRTPITI << UZUPEL;
    for (int i = 0; i < loop; i++) {
      plik2 << "0";
    }
    plik2 << koniec << "  CAT2W          " << bar.first << bar.second << "\n";

    for (int i = 0; i < rekordy; i++) {
      plik2 << wynik[i];
    }

    for (int i = 0; i < rekordy; i++) {
      plik2 << wynik2[i];
    }
  }
}
0

A na serio. Próbowałem zrobić tak, aby każda funkcja była fizycznie w osobnej funkcji. Efekt jest taki, że zawsze jakaś część mi nie działa (np. generowanie nazwy pliku wyjściowego). Żadnych błędów, wszystko sprawdzałem poprzez cout (np. wspomnianą nazwę pliku wyjściowego i było OK. Mimo to plik zapisywał się pod inną nazwą, lub też generował się pusty plik (wczytanie z innego pliku działa, przetworzenie jego zawartości działa, a zapis w właściwej formie już nie).

0

słyszałeś o czymś takim jak funkcje!
To podziel to funkcjami na logiczne kawałeczki. Np: wczytajDane, zapiszDane, policzA, itd.
Jak nie wiesz jak to posłuchaj rady Shalom i napisz to od nowa, korzystając z możliwości definiowania własnych funkcji (jedna funkcja maksymalnie 10 linii).

0

Czytałem i wiem jak się je tworzy. Niekiedy nie mogę mieć jednej funkcji w 10 liniach (jeśli dosłownie miałeś to na myśli), gdyż jak widziałeś sama funkcja substr w funkcjach zajmuje więcej niż te 10 linii. Stąd moja prośba o pomoc w ogarnięciu. Problem polega na tym, że nie bardzo widzę co dać w osobną funkcję (brak mi pomysłu)

EDIT
Mam jeszcze mały problem. Jak ustawić zabezpieczenie, aby w przypadku napotkania na spację na końcu, pustą linię, linie nie odpowiadającą danemu typowi (pierwsze 4 znaki linii w pliku) program ignorował taką linię, oraz nie zliczał takiej linii do licznika tych linii ??

0
  1. ta reguła nie jest ścisła
  2. widzę u ciebie błąd w kodzie: while (!plik3.eof()) { powinno być: while (getline(plik3, HEADR)) {
0

A co powoduje ten błąd ??
Jeszcze jedno. Czy można const char dać jako zmienna zwracana z funkcji, gdyż w całym programie 3-krotnie napisany jest poniższy fragment, który chciałbym wrzucić w jedną funkcję i po prostu wywołać w każdym wymaganym miejscy:

const char* zapis = nazwa.c_str();

fstream plik2(zapis, ios::out);
plik2 << "HDR" << HDRTPITI << UZUPEL;
for (int i = 0; i < loop; i++) {
  plik2 << "0";
}
plik2 << koniec << "  CAT2W          " << bar.first << bar.second << "\n";

Problem polega na tym, że nie wiem jak zwrócić z funkcji zmienna plik2 (właśnie ten const char), gdyż zmienna ta jest wykorzystywana dalej.

3
const char* zapis = nazwa.c_str();

Nie przypisuj wyniku c_str() do zmiennej - nawet jako const.

Pamięć zwracana przez c_str jest zwalniana wraz z destrukcją stringa od którego pochodzi - prędzej czy później przejedziesz się na tym.

Wywołuj c_str tylko wewnątrz wywołania funkcji przyjmującej char*:

fstream plik2(nazwa.c_str(), ios::out);

Problem polega na tym, że nie wiem jak zwrócić z funkcji zmienna plik2 (właśnie ten const char), gdyż zmienna ta jest wykorzystywana dalej.

Przecież plik2 jest typu fstream a nie żaden const char.

0

Poradziłem sobie to w inny sposób. Dalsza część kodu, zawiera zapis do pliku zmiennych wynik[i] w zależności, ile ich program zliczy podczas działania. Każda funkcja posiada tylko jedną możliwość zmiennej wynik[i], wyjątkiem jest funkcja kom030 (teraz u mnie pod taką nazwą istnieje fragment po if(typ=="030")), która zwraca wynik[i] oraz wynik2[i].

Dlatego rozwiązałem to tak, iż dałem to w dwie różne funkcje.
Dla kom030:

void zapisz030(){
	pair<string, string> bar = czas();
	const char * zapis = nazwa.c_str();
	fstream plik2 (zapis, ios::out);
	
	plik2<<"HDR"<<HDRTPITI<<UZUPEL;
	for (int i=0;i<loop;i++){
		plik2<<"0";
	}
	plik2<<koniec<<"  CAT2W          "<<bar.first<<bar.second<<"\n";
	
    for (int i=0;i<rekordy;i++){
		plik2<<wynik[i];
	}
		
	for (int i=0;i<rekordy;i++){
		plik2<<wynik2[i];
	}
}

Oraz dla reszty komunikatów (później będzie ich więcej niż 2, stąd takie rozwiązanie):

void zapisz(){
	pair<string, string> bar = czas();
	const char * zapis = nazwa.c_str();
	fstream plik2 (zapis, ios::out);
	
	plik2<<"HDR"<<HDRTPITI<<UZUPEL;
	for (int i=0;i<loop;i++){
		plik2<<"0";
	}
	plik2<<koniec<<"  CAT2W          "<<bar.first<<bar.second<<"\n";
	
	
	for (int i=0;i<rekordy;i++){
		plik2<<wynik[i];
	}
}

Pytanie mam jedno. Przez przypadek wywołałem owe funkcje, bez podania w argumentach zmiennych koniec, rekordy, loop, który są wykorzystywane w tych funkcjach. Ku mojemu zdziwieniu nie wyskoczył żaden błąd, program się skompilował oraz działa poprawnie. Czy tak powinno być, czy to tylko jednorazowo (zdarzało się, że po drugim uruchomieniu ta sama cześć przestała działać) ?? Co ty (lub wy) na to ??

0

Mały UPDATE:
Po kilku zmianach kod prezentuje się w ten sposób:

#include <fstream>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <utility>
#include <string>
#include <stdio.h>
#include <time.h>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <Windows.h>

using namespace std;

void kom010();
void kom013();
void kom030();
void zapisz();
void zapisz030();
int obliczLoop(int koniec);

HANDLE kolor;
string line;
string TPITI[99],SEMOV[99],CDMAG[99],MODAM[99],TELAC[99],FIL10[99],CNTER[99],NRVEN[99],COLLO[99],RRQNR[99],OUTFL[99];
string CDCOL[99],DESC1[99],DTMER[99],VINNO[99],DADOC[99],PESNE[99],LPCAR[99],MZZTR[99],SRCAR[99],PRIND[99],ININ2[99];
string PREIM[99],FLCEE[99],ENGIN[99],LNPRD[99],CDFOA[99],PESLO[99],CDCLM[99],INSAM[99],ININD[99],CAIND[99],LOIND[99],CDCLI[99];
string CDNAZ[99], CDCL2[99],DESAS[99],DOGAN[99],DESCL[99],NTORB[99],CDMA2[99],RAIND[99],CDNA2[99],ASVEF[99],I2IND[99];
string I2IN2[99],RRQDT[99],NRIN2[99],RAIN2[99],CAIN2[99],LOIN2[99],PRIN2[99],NORSD[99],DTCOC[99],LPCUS[99],VECST[99],ORPTY[99];
string MODPV[99],DORSD[99],CDVAL[99],NRPRG[99],NRFTF[99],TPASS[99],DAPCN[99],FREAM[99],NRIND[99],NRBOG[99], DABOG[99];
string HEADER, HEADR, HDRTPITI, HDRNTRAS, HDRNRECO, HDRCDMAG, HDRMITTE,HDRDTTRX, HDRORTRX;
string Rekord[99],wynik[99],wynikUZP[99],wynik2[99],UZUPEL,nazwa,typ;
int rekordy = 0, koniec = 0, i = 0, linie = 0, ile = 0, ile2 = 0, loop = 0,
    loop2 = 0, licznik = 0, uzup = 15;

pair<string, string> czas() {
  string DTBLE, TIME;
  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);

  return make_pair(DTBLE, TIME);
}

int main() {
  kolor = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(kolor, 10);

  fstream plik("in.txt", ios::in);
  pair<string, string> bar = czas();

  do {
    getline(plik, line);
    linie = linie + 1;
  } while (!plik.eof());
  plik.close();

  typ = line.substr(0, 4);
  rekordy = linie - 1;

  if (typ == "010+") {
    kom010();
    obliczLoop(koniec);
    zapisz();
  }

  if (typ == "013+") {
    kom013();
    obliczLoop(koniec);
    zapisz();
  }

  if (typ == "030+") {
    kom030();
    obliczLoop(koniec);
    zapisz();
  }
}

int obliczLoop(int koniec) {
  ile = (int)log10(koniec) + 1;
  loop = 5 - ile;

  return loop;
}

void zapisz030() {
  pair<string, string> bar = czas();
  const char* zapis = nazwa.c_str();
  fstream plik2(zapis, ios::out);

  plik2 << "HDR" << HDRTPITI << UZUPEL;
  for (int i = 0; i < loop; i++) {
    plik2 << "0";
  }
  plik2 << koniec << "  CAT2W          " << bar.first << bar.second << "\n";

  for (int i = 0; i < rekordy; i++) {
    plik2 << wynik[i];
  }

  for (int i = 0; i < rekordy; i++) {
    plik2 << wynik2[i];
  }
}

void zapisz() {
  pair<string, string> bar = czas();
  const char* zapis = nazwa.c_str();
  fstream plik2(zapis, ios::out);

  plik2 << "HDR" << HDRTPITI << UZUPEL;
  for (int i = 0; i < loop; i++) {
    plik2 << "0";
  }
  plik2 << koniec << "  CAT2W          " << bar.first << bar.second << "\n";

  for (int i = 0; i < rekordy; i++) {
    plik2 << wynik[i];
  }
}

void kom010() {
  pair<string, string> bar = czas();
  fstream plik3("in.txt", ios::in);
  while (!plik3.eof()) {
    getline(plik3, HEADR);
    HDRTPITI = 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);

    nazwa = "CAT" + HDRTPITI + ".txt";

    for (int i = 0; i < rekordy; i++) {
      getline(plik3, Rekord[i]);
      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);
      FIL10[i] = Rekord[i].substr(27, 13);
      CNTER[i] = Rekord[i].substr(40, 12);
      NRVEN[i] = Rekord[i].substr(52, 10);
      COLLO[i] = Rekord[i].substr(62, 6);
      CDCOL[i] = Rekord[i].substr(68, 3);
      DESC1[i] = Rekord[i].substr(71, 15);
      VINNO[i] = Rekord[i].substr(92, 17);
      NRFTF[i] = Rekord[i].substr(115, 11);
      CDVAL[i] = Rekord[i].substr(126, 3);
      PREIM[i] = Rekord[i].substr(129, 11);
      FLCEE[i] = Rekord[i].substr(140, 1);
      ENGIN[i] = Rekord[i].substr(141, 18);
      LNPRD[i] = Rekord[i].substr(159, 1);
      CDFOA[i] = Rekord[i].substr(160, 6);
      SRCAR[i] = Rekord[i].substr(166, 1);
      PESLO[i] = Rekord[i].substr(167, 7);
      CDCLM[i] = Rekord[i].substr(174, 3);
      INSAM[i] = Rekord[i].substr(177, 17);
      FREAM[i] = Rekord[i].substr(194, 17);
      PESNE[i] = Rekord[i].substr(211, 7);
      wynik[i] = "040" + SEMOV[i] + CDMAG[i] + MODAM[i] + TELAC[i] + bar.first +
                 "      " + bar.first + VINNO[i] + LNPRD[i] + "      \n";
    }
    int licznik = rekordy;
    koniec = licznik + 1;
  }
}

void kom013() {
  pair<string, string> bar = czas();
  fstream plik3("in.txt", ios::in);
  while (!plik3.eof()) {
    getline(plik3, HEADR);
    HDRTPITI = 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);

    nazwa = "CAT" + HDRTPITI + ".txt";

    for (int i = 0; i < rekordy; i++) {
      getline(plik3, Rekord[i]);
      TPITI[i] = Rekord[i].substr(0, 3);
      SEMOV[i] = Rekord[i].substr(3, 1);
      LNPRD[i] = Rekord[i].substr(4, 1);
      MODAM[i] = Rekord[i].substr(5, 15);
      TELAC[i] = Rekord[i].substr(20, 6);
      VINNO[i] = Rekord[i].substr(26, 17);
      DESCL[i] = Rekord[i].substr(43, 40);
      NTORB[i] = Rekord[i].substr(83, 1);
      CDMA2[i] = Rekord[i].substr(84, 2);
      CDCLI[i] = Rekord[i].substr(86, 6);
      NRIND[i] = Rekord[i].substr(92, 2);
      RAIND[i] = Rekord[i].substr(94, 35);
      ININD[i] = Rekord[i].substr(129, 35);
      CAIND[i] = Rekord[i].substr(164, 9);
      LOIND[i] = Rekord[i].substr(173, 20);
      PRIND[i] = Rekord[i].substr(193, 2);
      CDNAZ[i] = Rekord[i].substr(195, 3);
      CDMAG[i] = Rekord[i].substr(198, 2);
      CDCL2[i] = Rekord[i].substr(200, 6);
      NRIN2[i] = Rekord[i].substr(206, 2);
      RAIN2[i] = Rekord[i].substr(208, 35);
      ININ2[i] = Rekord[i].substr(243, 35);
      CAIN2[i] = Rekord[i].substr(278, 9);
      LOIN2[i] = Rekord[i].substr(287, 20);
      PRIN2[i] = Rekord[i].substr(307, 2);
      CDNA2[i] = Rekord[i].substr(309, 3);
      ASVEF[i] = Rekord[i].substr(312, 1);
      I2IND[i] = Rekord[i].substr(313, 35);
      I2IN2[i] = Rekord[i].substr(348, 35);
      RRQNR[i] = Rekord[i].substr(383, 7);
      RRQDT[i] = Rekord[i].substr(390, 10);
      OUTFL[i] = Rekord[i].substr(391, 1);
      CDCOL[i] = Rekord[i].substr(394, 3);
      CDCLM[i] = Rekord[i].substr(397, 3);
      wynik[i] = "014" + SEMOV[i] + LNPRD[i] + MODAM[i] + TELAC[i] + VINNO[i] +
                 bar.first + "        " + CDMAG[i] + CDCL2[i];
    }
    int licznik = rekordy * 1;
    koniec = licznik + 1;
  }
}

void kom030() {
  pair<string, string> bar = czas();
  fstream plik3("in.txt", ios::in);
  while (!plik3.eof()) {
    getline(plik3, HEADR);
    HDRTPITI = 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);

    nazwa = "CAT" + HDRTPITI + ".txt";

    for (int i = 0; i < rekordy; i++) {
      getline(plik3, Rekord[i]);
      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] + bar.first + LNPRD[i] +
                 NRPRG[i] + "\n";
      wynik2[i] = "060" + SEMOV[i] + CDMAG[i] + MODAM[i] + TELAC[i] +
                  bar.first + DAPCN[i] + "      " + VINNO[i] + LNPRD[i] +
                  "                    " + NRPRG[i] + "\n";
    }
    int licznik = rekordy * 2;
    koniec = licznik + 1;
  }
}

Co byście polecili jeszcze zrobić ??
Oraz czy mogę (tutaj pytanie w domyśle jak) zrobić, aby fragment

getline(plik3, HEADR);
HDRTPITI = 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);

nazwa = "CAT" + HDRTPITI + ".txt";

Był w osobnej funkcji, oraz żeby owe zmienne w niej zawarte były dostępne w reszcie programu ?? Tutaj także pytanie: jak to zrobić ??

0

użyj struktur/klas tak by zamiast mieć 10 tablic, mieć jedną z jakimiś obiektami.

struct TwojeTajemniczeDane {
    string TPITI;
    string SEMOV;
    string CDMAG;
    string MODAM;
    string TELAC;
    string FIL10;
    string CNTER;
    string NRVEN;
    string COLLO;
    string RRQNR;
    string OUTFL;
};

istream & czytajTajmniczaDana(istream &in, TwojeTajemniczeDane &data) {
     string linia;
     if (getline(data, linia)) {
         data.TPITI = linia.substr(0, 3);
         data.SEMOV = linia.substr(3, 1);
         data.CDMAG = linia.substr(4, 2);
         data.MODAM =linia.substr(6, 15);
         data.TELAC = linia.substr(21, 6);
         data.DESCL = linia.substr(27, 40);
         ……
     }
     return in;
}

Przy czym nazwy pól powinny być małymi literami.

0

OK. Czyli wszystkie zmienne mogę "wrzucić" do takiej klasy / struktury, a później do danych zmiennych przypisać poszczególne wartości ?? Wypisanie takiej zmiennej odbywa się normalnie, czy w przypadku klas / struktur było to jakoś inaczej (pytam bo już nie pamiętam) ??

0

Na razie nie robiłem tych klas/struktur.
Za to ponawiam swoje pytanie.
Co zrobić, aby podczas wczytywania z pliku:
[] nie liczyło linii, które nie zawierają rekordów (nie zaczynają się od 010, 013, 015, 030),
[
] owa funkcja: kom010,kom013,kom015,kom030 nie wczytywały tych nieliczonych funkcji
[*] program wczytywał tylko określoną liczbę wierszy (jeśli jest więcej niż powinno, wówczas po wczytaniu 100 z 100 znaków przechodził do następnej linii)
Poniżej aktualny kod po kilku poprawkach (P.S jak wasze opinie, co jeszcze musiałbym zmienić ??):

#include <fstream>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <utility>
#include <string>
#include <stdio.h>
#include <time.h>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <Windows.h>

using namespace std;

void kom010(const char * PLIK);
void kom013(const char * PLIK);
void kom015(const char * PLIK);
void kom030(const char * PLIK);
void menu(string typ, const char * PLIK);
void zapisz();
void zapisz030();
void informacje();
int obliczLoop(int koniec);
string Output_file(string HEADR);

	HANDLE kolor;
	string line;
    string TPITI[99],SEMOV[99],CDMAG[99],MODAM[99],TELAC[99],FIL10[99],CNTER[99],NRVEN[99],COLLO[99],CDCOL[99],DESC1[99],DTMER[99],VINNO[99],DADOC[99],PESNE[99],LPCAR[99],MZZTR[99],FIL15[99];
    string PREIM[99],FLCEE[99],ENGIN[99],LNPRD[99],CDFOA[99],SRCAR[99],PESLO[99],CDCLM[99],INSAM[99],ININD[99],CAIND[99],LOIND[99],PRIND[99],CDNAZ[99],CDCL2[99],DESAS[99],DOGAN[99],NRBLE[99];
    string DESCL[99],NTORB[99],CDMA2[99],RAIND[99],CDNA2[99],ASVEF[99],I2IND[99],I2IN2[99],RRQNR[99],RRQDT[99],OUTFL[99],NRIN2[99],RAIN2[99],ININ2[99],CAIN2[99],LOIN2[99],PRIN2[99],CTRNO[99];
	string NORSD[99],DTCOC[99],LPCUS[99],VECST[99],MODPV[99],DORSD[99],CDVAL[99],NRPRG[99],NRFTF[99],TPASS[99],DAPCN[99],FREAM[99],NRIND[99],NRBOG[99],DABOG[99],CDCLI[99],ORPTY[99];
    string HEADER,HEADR,HDRTPITI,HDRNTRAS,HDRNRECO,HDRCDMAG,HDRMITTE,HDRDTTRX,HDRORTRX;
    string Rekord[99],wynik[99],wynikUZP[99],wynik2[99],UZUPEL,nazwa,typ,odczyt,temp,format=".txt";
    int rekordy=0,koniec=0,i=0,linie=0,ile=0,ile2=0,loop=0,loop2=0,licznik=0,uzup=15;

pair<string, string> czas()
{
 	string DTBLE, TIME;
	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);
  	
    return make_pair(DTBLE, TIME);
}

int main(){
	system("cls");
	kolor = GetStdHandle( STD_OUTPUT_HANDLE );
	SetConsoleTextAttribute( kolor, 10 );
  	pair<string, string> bar = czas();
  	cin.clear();
  	
  	cout<<"Plik: ";
  	SetConsoleTextAttribute( kolor, 14 );
  	cin>>odczyt;
  	
  	if(odczyt=="!"){
  		return 0;
	  }
	if(odczyt=="?"){
		informacje();
		getch();
		main();
	}
	else{
		
		temp=odczyt+format;
		const char * PLIK =temp.c_str(); 
		fstream plik (PLIK, ios::in);
  	
  		if(plik.good()==false){
  		
	    	SetConsoleTextAttribute( kolor, 12 );
			system("cls");
			cout<<"Plik: "<<PLIK<<" nie istnieje";
			SetConsoleTextAttribute( kolor, 10 );
			getch();
			main();
		}else{
  			do
			{
  				getline(plik, line);
  				linie=linie+1;
			}
			while(!plik.eof());
			plik.close();
	
			typ=line.substr(0,4);
			rekordy=linie-1;
	
			menu(typ, PLIK);
		}
	}
}

void menu(string typ, const char * PLIK){
	if(typ=="010+"){
		kom010(PLIK);
		obliczLoop(koniec);
		zapisz();
	}
		
	if(typ=="013+"){
		kom013(PLIK);	
		obliczLoop(koniec);
		zapisz();
	}
	
	if(typ=="015+" || typ=="015-"){
		kom015(PLIK);	
		obliczLoop(koniec);
		zapisz();
	}
		
	if(typ=="030+"){
		kom030(PLIK);
		obliczLoop(koniec);
		zapisz030();
	}
}

int obliczLoop(int koniec){	   
	ile=(int)log10(koniec)+1;
	loop=5-ile;
	
	return loop;
}

void zapisz030(){
	pair<string, string> bar = czas();
	const char * zapis = nazwa.c_str();
	fstream plik2 (zapis, ios::out);
	
	plik2<<"HDR"<<HDRTPITI<<UZUPEL;
	for (int i=0;i<loop;i++){
		plik2<<"0";
	}
	
	plik2<<koniec<<"  CAT2W          "<<bar.first<<bar.second<<"\n";
	
    for (int i=0;i<rekordy;i++){
		plik2<<wynik[i];
	}
		
	for (int i=0;i<rekordy;i++){
		plik2<<wynik2[i];
	}
}

void zapisz(){
	pair<string, string> bar = czas();
	const char * zapis = nazwa.c_str();
	fstream plik2 (zapis, ios::out);
	
	plik2<<"HDR"<<HDRTPITI<<UZUPEL;
	for (int i=0;i<loop;i++){
		plik2<<"0";
	}
	
	plik2<<koniec<<"  CAT2W          "<<bar.first<<bar.second<<"\n";
	
	for (int i=0;i<rekordy;i++){
		plik2<<wynik[i];
	}
}

string Output_file(string HEADR)
{
		HDRTPITI=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);
	    
	    nazwa="CAT"+HDRTPITI+".txt";
	    
	    return nazwa;
}

void informacje(){
	system("cls");
	//funkcja jeszcze nie zdefiniowana, ma posiadać kilka informacji 
}

void kom010(const char * PLIK){
	pair<string, string> bar = czas();
	fstream plik3 ("in.txt", ios::in);
  	while(!plik3.eof()){
        getline(plik3, HEADR);
    	Output_file(HEADR);
    	
        for (int i=0;i<rekordy;i++){
        	getline(plik3, Rekord[i]);
        	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);
        	FIL10[i]=Rekord[i].substr(27,13);
        	CNTER[i]=Rekord[i].substr(40,12);
        	NRVEN[i]=Rekord[i].substr(52,10);
        	COLLO[i]=Rekord[i].substr(62,6);
        	CDCOL[i]=Rekord[i].substr(68,3);
        	DESC1[i]=Rekord[i].substr(71,15);
        	VINNO[i]=Rekord[i].substr(92,17);
        	NRFTF[i]=Rekord[i].substr(115,11);
        	CDVAL[i]=Rekord[i].substr(126,3);
        	PREIM[i]=Rekord[i].substr(129,11);
        	FLCEE[i]=Rekord[i].substr(140,1);
			ENGIN[i]=Rekord[i].substr(141,18);
			LNPRD[i]=Rekord[i].substr(159,1);
			CDFOA[i]=Rekord[i].substr(160,6);
			SRCAR[i]=Rekord[i].substr(166,1);
			PESLO[i]=Rekord[i].substr(167,7);
			CDCLM[i]=Rekord[i].substr(174,3);
			INSAM[i]=Rekord[i].substr(177,17);
			FREAM[i]=Rekord[i].substr(194,17);
			PESNE[i]=Rekord[i].substr(211,7);
			wynik[i]="040"+SEMOV[i]+CDMAG[i]+MODAM[i]+TELAC[i]+bar.first+"      "+bar.first+VINNO[i]+LNPRD[i]+"      \n";
        }
        int licznik=rekordy*1;
    	koniec=licznik+1; 
	}
}

void kom013(const char * PLIK){
	pair<string, string> bar = czas();
	fstream plik3 ("in.txt", ios::in);
  	while(!plik3.eof()){
       	getline(plik3, HEADR);
    	Output_file(HEADR);
    		
        for (int i=0;i<rekordy;i++){
	       	getline(plik3, Rekord[i]);
			TPITI[i]=Rekord[i].substr(0,3);
			SEMOV[i]=Rekord[i].substr(3,1);
			LNPRD[i]=Rekord[i].substr(4,1);
			MODAM[i]=Rekord[i].substr(5,15);
			TELAC[i]=Rekord[i].substr(20,6);
			VINNO[i]=Rekord[i].substr(26,17);
			DESCL[i]=Rekord[i].substr(43,40);
			NTORB[i]=Rekord[i].substr(83,1);
			CDMA2[i]=Rekord[i].substr(84,2);
			CDCLI[i]=Rekord[i].substr(86,6);
			NRIND[i]=Rekord[i].substr(92,2);
			RAIND[i]=Rekord[i].substr(94,35);
			ININD[i]=Rekord[i].substr(129,35);
			CAIND[i]=Rekord[i].substr(164,9);
			LOIND[i]=Rekord[i].substr(173,20);
			PRIND[i]=Rekord[i].substr(193,2);
			CDNAZ[i]=Rekord[i].substr(195,3);
			CDMAG[i]=Rekord[i].substr(198,2);
			CDCL2[i]=Rekord[i].substr(200,6);
			NRIN2[i]=Rekord[i].substr(206,2);
			RAIN2[i]=Rekord[i].substr(208,35);
			ININ2[i]=Rekord[i].substr(243,35);
			CAIN2[i]=Rekord[i].substr(278,9);
			LOIN2[i]=Rekord[i].substr(287,20);
			PRIN2[i]=Rekord[i].substr(307,2);
			CDNA2[i]=Rekord[i].substr(309,3);
			ASVEF[i]=Rekord[i].substr(312,1);
			I2IND[i]=Rekord[i].substr(313,35);
			I2IN2[i]=Rekord[i].substr(348,35);
			RRQNR[i]=Rekord[i].substr(383,7);
			RRQDT[i]=Rekord[i].substr(390,10);
			OUTFL[i]=Rekord[i].substr(391,1);
			CDCOL[i]=Rekord[i].substr(394,3);
			CDCLM[i]=Rekord[i].substr(397,3);
			wynik[i]="014"+SEMOV[i]+LNPRD[i]+MODAM[i]+TELAC[i]+VINNO[i]+bar.first+"        "+CDMAG[i]+CDCL2[i];
        }
        int licznik=rekordy*1;
        koniec=licznik+1; 
	}
}

void kom030(const char * PLIK){
	pair<string, string> bar = czas();
	fstream plik3 (PLIK, ios::in);
  	while(!plik3.eof()){
	    getline(plik3, HEADR);
    	Output_file(HEADR);
    	
        for (int i=0;i<rekordy;i++){
	       	getline(plik3, Rekord[i]);
    	   	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]+bar.first+LNPRD[i]+NRPRG[i]+"\n";
			wynik2[i]="060"+SEMOV[i]+CDMAG[i]+MODAM[i]+TELAC[i]+bar.first+DAPCN[i]+"      "+VINNO[i]+LNPRD[i]+"                    "+NRPRG[i]+"\n";
        }
    	int licznik=rekordy*2;
    	koniec=licznik+1; 
	}
}

void kom015(const char * PLIK){
	pair<string, string> bar = czas();
	fstream plik3 ("in.txt", ios::in);
  	while(!plik3.eof()){
	    getline(plik3, HEADR);
    	Output_file(HEADR);
    	
        for (int i=0;i<rekordy;i++){
	       	getline(plik3, Rekord[i]);
    	   	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);
			FIL15[i]=Rekord[i].substr(27,13);
			CNTER[i]=Rekord[i].substr(40,12);
			NRVEN[i]=Rekord[i].substr(52,10);
			COLLO[i]=Rekord[i].substr(62,6);
			CDCOL[i]=Rekord[i].substr(68,3);
			DESC1[i]=Rekord[i].substr(71,15);
			ENGIN[i]=Rekord[i].substr(86,18);
			LNPRD[i]=Rekord[i].substr(104,1);
			VINNO[i]=Rekord[i].substr(105,17);
			//wynik[i]="040"+SEMOV[i]+CDMAG[i]+MODAM[i]+TELAC[i]+DTBLE[i]+NRBLE[i]+DTARR[i]+VINNO[i]+LNPRD[i]+CTRNO[i]+"\n";
			wynik[i]="040"+SEMOV[i]+CDMAG[i]+MODAM[i]+TELAC[i]+bar.first+NRBLE[i]+bar.first+LNPRD[i]+CTRNO[i]+"\n";
        }
    	int licznik=rekordy*2;
    	koniec=licznik+1; 
	}
}

A poniżej przykład pliku wejściowego, wraz z informacją co ma wczytać, a co nie:

[0]HDR0032900009O2SMP            150602124558
[1]030+O2GSX-S1000AL615 101437XXXXXXXX NIEBIESKI (BLUE(YSF)           1Sales                         JS1DG1122G01014370000OMB0000506150607C2YSF   GSX-S1000AL615
[2]030+O2UK110NEL515    103256XXXXXXXX BIALY (WHITE)(YUH)             1Sales                         MH8DE1111001032560000OMC0000507150607C2YUH   UK110NEL515
[3]
[4]test
[5]030+O2UK110NEL515    103256XXXXXXXX BIALY (WHITE)(YUH)             1Sales                         MH8DE1111001032560000OMC0000507150607C2YUH   UK110NEL515 1
[6]

Wczytać (oraz zliczyć) powinno linie nr: 0,1,2 (numer w nawiasie kwadratowym, nie jest częścią rekordu)
numer 5 niby jest OK, ale na końcu są dwa dodatkowe znaki, czyli "[spacja] 1"

1
Kremius napisał(a):

Na razie nie robiłem tych klas/struktur.

Kolego, przede wszystkim to jest właśnie to, od czego powinieneś zacząć. Każdy wcześniejszy post to cenna wskazówka dla Ciebie, która właśnie o tym mówi. Przeczytaj szczególnie posty @MarekR22. Zobaczysz, że gdy już pogrupujesz odpowiednio dane, wyodrębnisz wspólną funkcjonalność to okaże się, że wyżej postawione problemy same się rozwiążą. Nawet lepiej - dojdziesz pewnie do wniosku, że niektóre redundantne operacje w tym kodzie nie mają sensu.

Uwierz, że na chwilę obecną nikt nie ma ochoty analizować takiego kodu, który wrzuciłeś - jest po prostu nieczytelny/źle napisany. Przemyśl to, zmień to i najlepiej przepisz na nowo. Wtedy śmiało będziesz mógł zapytać, co można by zmienić, ale pewnie nie będziesz musiał, bo ta czytelność sprawi, że sam na to wpadniesz.

0

OK. Zacznę od tego. Jednak klasy / struktury zawsze były dla mnie nie zrozumiałe. Dlatego też zanim zrobię jakąś zmianę mam pytanie. Czy powyższy kod będzie poprawny:

//deklaracja zmiennej oczywiście :)
class TwojaKlasa {
  string test;
};

int main() {
  TwojaKlasa nazwaZmiennej;
  string test = "test dzialania klas";
//przypisanie do następnej zmiennej 4 pierwszych znaków ciągu znaków
  nazwaZmiennej.zmienna2 = test.substr(0, 4);
//wypisanie "nowej" zmiennej
  cout << zmienna2;
  return (0);
}

Czy powyższy fragment ma szansę działać ?? Nie czy program się odpali, ale czy według was jest poprawnie napisane ??

Jeszcze jedno, zrobiłem tak jak napisał MarekR22

widzę u ciebie błąd w kodzie: while (!plik3.eof()) { powinno być: while (getline(plik3, HEADR)) {

Problem polega na tym, że plik wyjściowy się nie generuje, przed zmianą wszystko działa poprawnie.

Czytając trochę post MarekR22, internetu i własnego rozumu (tak wiem, słabo działa ;) ).
Udało mi się zrobić klasę ze publicznymi zmiennymi (czy jak to nazwać):

class Moduly {
public:
  string TPITI, SEMOV, CDMAG, MODAM, TELAC, FIL10, CNTER, NRVEN, COLLO, CDCOL,
      DESC1, DTMER, VINNO, DADOC, PESNE, LPCAR, MZZTR, FIL15;
  string PREIM, FLCEE, ENGIN, LNPRD, CDFOA, SRCAR, PESLO, CDCLM, INSAM, ININD,
      CAIND, LOIND, PRIND, CDNAZ, CDCL2, DESAS, DOGAN, NRBLE;
  string DESCL, NTORB, CDMA2, RAIND, CDNA2, ASVEF, I2IND, I2IN2, RRQNR, RRQDT,
      OUTFL, NRIN2, RAIN2, ININ2, CAIN2, LOIN2, PRIN2, CTRNO;
  string NORSD, DTCOC, LPCUS, VECST, MODPV, DORSD, CDVAL, NRPRG, NRFTF, TPASS,
      DAPCN, FREAM, NRIND, NRBOG, DABOG, CDCLI, ORPTY;
};

oraz takie oto wykorzystanie klasy w programie:

void kom010(const char* PLIK) {
  pair<string, string> bar = czas();
  fstream plik3(PLIK, ios::in);
  while (!plik3.eof()) {
    getline(plik3, HEADR);
    Output_file(HEADR);

    for (int i = 0; i < rekordy; i++) {
      Moduly Modul;
      getline(plik3, Rekord[i]);
      Modul.TPITI = Rekord[i].substr(0, 3);
      Modul.SEMOV = Rekord[i].substr(3, 1);
      Modul.CDMAG = Rekord[i].substr(4, 2);
      Modul.MODAM = Rekord[i].substr(6, 15);
      Modul.TELAC = Rekord[i].substr(21, 6);
      Modul.FIL10 = Rekord[i].substr(27, 13);
      Modul.CNTER = Rekord[i].substr(40, 12);
      Modul.NRVEN = Rekord[i].substr(52, 10);
      Modul.COLLO = Rekord[i].substr(62, 6);
      Modul.CDCOL = Rekord[i].substr(68, 3);
      Modul.DESC1 = Rekord[i].substr(71, 15);
      Modul.VINNO = Rekord[i].substr(92, 17);
      Modul.NRFTF = Rekord[i].substr(115, 11);
      Modul.CDVAL = Rekord[i].substr(126, 3);
      Modul.PREIM = Rekord[i].substr(129, 11);
      Modul.FLCEE = Rekord[i].substr(140, 1);
      Modul.ENGIN = Rekord[i].substr(141, 18);
      Modul.LNPRD = Rekord[i].substr(159, 1);
      Modul.CDFOA = Rekord[i].substr(160, 6);
      Modul.SRCAR = Rekord[i].substr(166, 1);
      Modul.PESLO = Rekord[i].substr(167, 7);
      Modul.CDCLM = Rekord[i].substr(174, 3);
      Modul.INSAM = Rekord[i].substr(177, 17);
      Modul.FREAM = Rekord[i].substr(194, 17);
      Modul.PESNE = Rekord[i].substr(211, 7);
      wynik[i] = "040" + Modul.SEMOV + Modul.CDMAG + Modul.MODAM + Modul.TELAC +
                 bar.first + "      " + bar.first + Modul.VINNO + Modul.LNPRD +
                 "      \n";
    }
    int licznik = rekordy * 1;
    koniec = licznik + 1;
  }
}

Czy o coś takiego wam chodziło ?? Co mogę poprawić, aby było lepiej ??

Jeszcze jedno zrobiłem wczoraj sprawdzenie wierszy pliku wejściowego pod kątem licznik linii, co działało poprawnie, takie same sprawdzenie (if'a) dałem przy wczytywaniu (jeśli linia równa się coś, lub coś, itp ma nie robić nic, w przeciwnym przypadku ma wczytać linie). O ile przy sprawdzeniu działało, o tyle przy wczytywaniu już nie (sprawdzenie było identyczne dla obu funkcji), dlaczego tak się działo ??

0

Chwilkę nad tym posiedziałem i mam coś takiego:

#include <fstream>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <utility>
#include <string>
#include <stdio.h>
#include <time.h>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <Windows.h>

using namespace std;

// deklaracje wszystkich funkcji występujących w programie
void kom010(const char* PLIK);
void kom013(const char* PLIK);
void kom015(const char* PLIK);
void kom030(const char* PLIK);
void menu(string typ, const char* PLIK);
void zapisz();
void zapisz030();
void informacje();
int obliczLoop(int koniec);
string Output_file(string HEADR);

HANDLE kolor;
string line;
string HEADER, HEADR, HDRTPITI, HDRNTRAS, HDRNRECO, HDRCDMAG, HDRMITTE,
    HDRDTTRX, HDRORTRX;
string Rekord[99], wynik[99], wynikUZP[99], wynik2[99], UZUPEL, nazwa, typ,
    odczyt, PLIK, format = ".txt";
int rekordy = 0, koniec = 0, i = 0, linie = 0, ile = 0, ile2 = 0, loop = 0,
    loop2 = 0, uzup = 15;

pair<string, string> czas() {
  string DTBLE, TIME;
  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);

  return make_pair(DTBLE, TIME);
}

class Moduly {
public:
  string TPITI, SEMOV, CDMAG, MODAM, TELAC, FIL10, CNTER, NRVEN, COLLO, CDCOL,
      DESC1, DTMER, VINNO, DADOC, PESNE, LPCAR, MZZTR, FIL15;
  string PREIM, FLCEE, ENGIN, LNPRD, CDFOA, SRCAR, PESLO, CDCLM, INSAM, ININD,
      CAIND, LOIND, PRIND, CDNAZ, CDCL2, DESAS, DOGAN, NRBLE;
  string DESCL, NTORB, CDMA2, RAIND, CDNA2, ASVEF, I2IND, I2IN2, RRQNR, RRQDT,
      OUTFL, NRIN2, RAIN2, ININ2, CAIN2, LOIN2, PRIN2, CTRNO;
  string NORSD, DTCOC, LPCUS, VECST, MODPV, DORSD, CDVAL, NRPRG, NRFTF, TPASS,
      DAPCN, FREAM, NRIND, NRBOG, DABOG, CDCLI, ORPTY;
};

int main() {
  system("cls");
  kolor = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(kolor, 10);
  pair<string, string> bar = czas();
  cin.clear();

  cout << "Plik: ";
  SetConsoleTextAttribute(kolor, 14);
  cin >> odczyt;

  if (odczyt == "!") {
    return 0;
  }
  if (odczyt == "?") {
    informacje();
    getch();
    main();
  } else {

    PLIK = odczyt + format;
    fstream plik(PLIK.c_str(), ios::in);

    if (plik.good() == false) {

      SetConsoleTextAttribute(kolor, 12);
      system("cls");
      cout << "Plik: " << PLIK.c_str() << " nie istnieje";
      SetConsoleTextAttribute(kolor, 10);
      getch();
      main();
    } else {
      do {
        getline(plik, line);
        linie = linie + 1;
      } while (!plik.eof());
      plik.close();

      typ = line.substr(0, 4);
      rekordy = linie - 1;

      menu(typ, PLIK.c_str());
    }
  }
}

void menu(string typ, const char* PLIK) {
  if (typ == "010+") {
    kom010(PLIK);
    obliczLoop(koniec);
    zapisz();
  }

  if (typ == "013+") {
    kom013(PLIK);
    obliczLoop(koniec);
    zapisz();
  }

  if (typ == "015+" || typ == "015-") {
    kom015(PLIK);
    obliczLoop(koniec);
    zapisz();
  }

  if (typ == "030+") {
    kom030(PLIK);
    obliczLoop(koniec);
    zapisz030();
  }
}

int obliczLoop(int koniec) {
  ile = (int)log10(koniec) + 1;
  loop = 5 - ile;

  return loop;
}

void zapisz030() {
  pair<string, string> bar = czas();
  fstream plik2(nazwa.c_str(), ios::out);

  plik2 << "HDR" << HDRTPITI << UZUPEL;
  for (int i = 0; i < loop; i++) {
    plik2 << "0";
  }

  plik2 << koniec << "  CAT2W          " << bar.first << bar.second << "\n";

  for (int i = 0; i < rekordy; i++) {
    plik2 << wynik[i];
  }

  for (int i = 0; i < rekordy; i++) {
    plik2 << wynik2[i];
  }
}

void zapisz() {
  pair<string, string> bar = czas();
  fstream plik2(nazwa.c_str(), ios::out);

  plik2 << "HDR" << HDRTPITI << UZUPEL;
  for (int i = 0; i < loop; i++) {
    plik2 << "0";
  }

  plik2 << koniec << "  CAT2W          " << bar.first << bar.second << "\n";

  for (int i = 0; i < rekordy; i++) {
    plik2 << wynik[i];
  }
}

string Output_file(string HEADR) {
  HDRTPITI = HEADR.substr(3, 5);
  nazwa = "CAT" + HDRTPITI + ".txt";

  return nazwa;
}

void informacje() {
  // funkcja chwilowo nie ma zawartosci
}

void kom010(const char* PLIK) {
  pair<string, string> bar = czas();
  fstream plik3(PLIK, ios::in);
  while (!plik3.eof()) {
    getline(plik3, HEADR);
    Output_file(HEADR);

    for (int i = 0; i < rekordy; i++) {
      Moduly Modul;
      getline(plik3, Rekord[i]);
      Modul.TPITI = Rekord[i].substr(0, 3);
      Modul.SEMOV = Rekord[i].substr(3, 1);
      Modul.CDMAG = Rekord[i].substr(4, 2);
      Modul.MODAM = Rekord[i].substr(6, 15);
      Modul.TELAC = Rekord[i].substr(21, 6);
      Modul.FIL10 = Rekord[i].substr(27, 13);
      Modul.CNTER = Rekord[i].substr(40, 12);
      Modul.NRVEN = Rekord[i].substr(52, 10);
      Modul.COLLO = Rekord[i].substr(62, 6);
      Modul.CDCOL = Rekord[i].substr(68, 3);
      Modul.DESC1 = Rekord[i].substr(71, 15);
      Modul.VINNO = Rekord[i].substr(92, 17);
      Modul.NRFTF = Rekord[i].substr(115, 11);
      Modul.CDVAL = Rekord[i].substr(126, 3);
      Modul.PREIM = Rekord[i].substr(129, 11);
      Modul.FLCEE = Rekord[i].substr(140, 1);
      Modul.ENGIN = Rekord[i].substr(141, 18);
      Modul.LNPRD = Rekord[i].substr(159, 1);
      Modul.CDFOA = Rekord[i].substr(160, 6);
      Modul.SRCAR = Rekord[i].substr(166, 1);
      Modul.PESLO = Rekord[i].substr(167, 7);
      Modul.CDCLM = Rekord[i].substr(174, 3);
      Modul.INSAM = Rekord[i].substr(177, 17);
      Modul.FREAM = Rekord[i].substr(194, 17);
      Modul.PESNE = Rekord[i].substr(211, 7);
      wynik[i] = "040" + Modul.SEMOV + Modul.CDMAG + Modul.MODAM + Modul.TELAC +
                 bar.first + "      " + bar.first + Modul.VINNO + Modul.LNPRD +
                 "      \n";
    }
    koniec = rekordy + 1;
  }
}

void kom013(const char* PLIK) {
  pair<string, string> bar = czas();
  fstream plik3(PLIK, ios::in);
  while (!plik3.eof()) {
    getline(plik3, HEADR);
    Output_file(HEADR);

    for (int i = 0; i < rekordy; i++) {
      Moduly Modul;
      getline(plik3, Rekord[i]);
      Modul.TPITI = Rekord[i].substr(0, 3);
      Modul.SEMOV = Rekord[i].substr(3, 1);
      Modul.LNPRD = Rekord[i].substr(4, 1);
      Modul.MODAM = Rekord[i].substr(5, 15);
      Modul.TELAC = Rekord[i].substr(20, 6);
      Modul.VINNO = Rekord[i].substr(26, 17);
      Modul.DESCL = Rekord[i].substr(43, 40);
      Modul.NTORB = Rekord[i].substr(83, 1);
      Modul.CDMA2 = Rekord[i].substr(84, 2);
      Modul.CDCLI = Rekord[i].substr(86, 6);
      Modul.NRIND = Rekord[i].substr(92, 2);
      Modul.RAIND = Rekord[i].substr(94, 35);
      Modul.ININD = Rekord[i].substr(129, 35);
      Modul.CAIND = Rekord[i].substr(164, 9);
      Modul.LOIND = Rekord[i].substr(173, 20);
      Modul.PRIND = Rekord[i].substr(193, 2);
      Modul.CDNAZ = Rekord[i].substr(195, 3);
      Modul.CDMAG = Rekord[i].substr(198, 2);
      Modul.CDCL2 = Rekord[i].substr(200, 6);
      Modul.NRIN2 = Rekord[i].substr(206, 2);
      Modul.RAIN2 = Rekord[i].substr(208, 35);
      Modul.ININ2 = Rekord[i].substr(243, 35);
      Modul.CAIN2 = Rekord[i].substr(278, 9);
      Modul.LOIN2 = Rekord[i].substr(287, 20);
      Modul.PRIN2 = Rekord[i].substr(307, 2);
      Modul.CDNA2 = Rekord[i].substr(309, 3);
      Modul.ASVEF = Rekord[i].substr(312, 1);
      Modul.I2IND = Rekord[i].substr(313, 35);
      Modul.I2IN2 = Rekord[i].substr(348, 35);
      Modul.RRQNR = Rekord[i].substr(383, 7);
      Modul.RRQDT = Rekord[i].substr(390, 10);
      Modul.OUTFL = Rekord[i].substr(391, 1);
      Modul.CDCOL = Rekord[i].substr(394, 3);
      Modul.CDCLM = Rekord[i].substr(397, 3);
      wynik[i] = "014" + Modul.SEMOV + Modul.LNPRD + Modul.MODAM + Modul.TELAC +
                 Modul.VINNO + bar.first + "        " + Modul.CDMAG +
                 Modul.CDCL2;
    }
    koniec = rekordy + 1;
  }
}

void kom030(const char* PLIK) {
  pair<string, string> bar = czas();
  fstream plik3(PLIK, ios::in);
  while (!plik3.eof()) {
    getline(plik3, HEADR);
    Output_file(HEADR);

    for (int i = 0; i < rekordy; i++) {
      Moduly Modul;
      getline(plik3, Rekord[i]);
      Modul.TPITI = Rekord[i].substr(0, 3);
      Modul.SEMOV = Rekord[i].substr(3, 1);
      Modul.CDMAG = Rekord[i].substr(4, 2);
      Modul.MODAM = Rekord[i].substr(6, 15);
      Modul.TELAC = Rekord[i].substr(21, 6);
      Modul.DESCL = Rekord[i].substr(27, 40);
      Modul.TPASS = Rekord[i].substr(67, 1);
      Modul.DESAS = Rekord[i].substr(68, 30);
      Modul.VINNO = Rekord[i].substr(98, 17);
      Modul.MZZTR = Rekord[i].substr(115, 4);
      Modul.NTORB = Rekord[i].substr(119, 1);
      Modul.LNPRD = Rekord[i].substr(120, 1);
      Modul.ORPTY = Rekord[i].substr(121, 1);
      Modul.NRPRG = Rekord[i].substr(122, 7);
      Modul.DAPCN = Rekord[i].substr(129, 6);
      Modul.LPCAR = Rekord[i].substr(135, 2);
      Modul.CDCOL = Rekord[i].substr(137, 3);
      Modul.CDCLM = Rekord[i].substr(140, 3);
      wynik[i] = "022" + Modul.SEMOV + Modul.CDMAG + Modul.VINNO + bar.first +
                 Modul.LNPRD + Modul.NRPRG + "\n";
      wynik2[i] = "060" + Modul.SEMOV + Modul.CDMAG + Modul.MODAM +
                  Modul.TELAC + bar.first + Modul.DAPCN + "      " +
                  Modul.VINNO + Modul.LNPRD + "                    " +
                  Modul.NRPRG + "\n";
    }
    koniec = (rekordy * 2) + 1;
  }
}

void kom015(const char* PLIK) {
  pair<string, string> bar = czas();
  fstream plik3(PLIK, ios::in);
  while (!plik3.eof()) {
    getline(plik3, HEADR);
    Output_file(HEADR);

    for (int i = 0; i < rekordy; i++) {
      Moduly Modul;
      getline(plik3, Rekord[i]);
      Modul.TPITI = Rekord[i].substr(0, 3);
      Modul.SEMOV = Rekord[i].substr(3, 1);
      Modul.CDMAG = Rekord[i].substr(4, 2);
      Modul.MODAM = Rekord[i].substr(6, 15);
      Modul.TELAC = Rekord[i].substr(21, 6);
      Modul.FIL15 = Rekord[i].substr(27, 13);
      Modul.CNTER = Rekord[i].substr(40, 12);
      Modul.NRVEN = Rekord[i].substr(52, 10);
      Modul.COLLO = Rekord[i].substr(62, 6);
      Modul.CDCOL = Rekord[i].substr(68, 3);
      Modul.DESC1 = Rekord[i].substr(71, 15);
      Modul.ENGIN = Rekord[i].substr(86, 18);
      Modul.LNPRD = Rekord[i].substr(104, 1);
      Modul.VINNO = Rekord[i].substr(105, 17);
      // wynik[i]="040"+SEMOV[i]+CDMAG[i]+MODAM[i]+TELAC[i]+DTBLE[i]+NRBLE[i]+DTARR[i]+VINNO[i]+LNPRD[i]+CTRNO[i]+"\n";
      wynik[i] = "040" + Modul.SEMOV + Modul.CDMAG + Modul.MODAM + Modul.TELAC +
                 bar.first + Modul.NRBLE + bar.first + Modul.LNPRD +
                 Modul.CTRNO + "\n";
    }
    koniec = (rekordy * 2) + 1;
  }
}

Potrzebuje podpowiedzi gdzie wpleść sprawdzenie wcześniej opisanych założeń (ignorowanie pustych linii, ignorowanie innych linii jak rekord (rozpoczyna się od 010,013,015,030) oraz ignorowanie znaków po określonej liczbie (każdy rekord ma swoją określoną wielkość, jeśli będzie dodatkowy znak na końcu ma być ignorowany i program ma wczytać następną linie) ?? Pomożecie mi z tym, bo nie wiem gdzie (oraz jak) takie coś zrobić ??

Dodatkowo mam pytanie, czy jest sposób aby wczytać nieznaną liczbę nazw pliku (program na początku chce nazwy pliku txt, chodzi o to aby wykonał ten sam program na różnej ilości plików jednocześni (np. nazwy oddzielone spacją) ??

0

Wracam z starym pytanie. Czy można wczytać na raz kilka plików i uruchomić ten sam program dla tych plików ?? Ilość plików w danej chwili uruchomienia programu nie jest określona i znana (oczywiście do chwili uruchomienia)

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