porządek w kodzie - pomóżcie

porządek w kodzie - pomóżcie
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

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

Kopiuj
#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];
    }
  }
}
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
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).

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
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).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
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 ??

edytowany 1x, ostatnio: Kremius
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
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)) {

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
NI
to to jest błędem?
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
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:

Kopiuj
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.

edytowany 1x, ostatnio: Kremius
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
3
Kopiuj
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*:

Kopiuj
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.

edytowany 2x, ostatnio: Azarien
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
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:

Kopiuj
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):

Kopiuj
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 ??

edytowany 1x, ostatnio: Kremius
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

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

Kopiuj
#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

Kopiuj
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ć ??

edytowany 1x, ostatnio: Kremius
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
0

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

Kopiuj
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
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) ??

edytowany 1x, ostatnio: Kremius
fasadin
to nie pytaj tylko wygoogluj...
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
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ć ??):

Kopiuj
#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:

Kopiuj
[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"

EvilOne
  • Rejestracja:około 14 lat
  • Ostatnio:około miesiąc
  • Postów:78
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.

KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
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:

Kopiuj
//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ć):

Kopiuj
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:

Kopiuj
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 ??

edytowany 3x, ostatnio: Kremius
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

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

Kopiuj
#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ą) ??

KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
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)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)