Usuwanie pustych wierszy z pliku

Usuwanie pustych wierszy z pliku
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

Mam problem.
Otóż napisałem program, który według założenia ma usuwać wszystkie linie inne niż te, które zaczynają się od pewnego ciągu znaków.
Problem polega na tym, że program do pliku wyjściowego zapisuje tylko puste linie (\n). Gdzie jest błąd ??

Kopiuj
int main() {
  int numer, i;
  fstream plik("test.txt", ios::in);
  fstream plik2("test2.txt", ios::out);
  if (plik.good()) {
    i = 0;

    while (!plik.eof()) {
      getline(plik, wiersz);
      string sprawdz = wiersz.substr(0, 4);

      if (sprawdz == "030+") {
        plik2 << wiersze[i] << "\n";
        cout << i;
        i++;
      } else {
      }
    }
    plik.close();
  }
}
twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
1
Kopiuj
getline(plik, wiersz);
...
plik2 << wiersze[i] << "\n";

co ma wiersz do wiersze?

NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

nie wiem czy zauważyłeś, ale masz if'a: jeśli linia jest tą do usunięcia to zrób pustą linię jeśli nie to nic nie rób
... to jak ma wpisywać co innego?
poza tym nie napisałeś definicji wiersze więc jak mamy pomóc?


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
edytowany 1x, ostatnio: Niikelion
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

Problem chyba rozwiązałem. Działa tak, jak sobie tego życzę. Poniżej kod, abyście sprawdzili, czy ma to ręce i nogi (jeśli możecie):

Kopiuj
fstream plik("test.txt", ios::in);
fstream plik2("test.txt", ios::in);
fstream plik3("test2.txt", ios::out);
string tmp, HEADR, sprawdz;

getline(plik2, HEADR);
plik2.close();
plik3 << HEADR << endl;
do {
  getline(plik, tmp);
  sprawdz = tmp.substr(0, 4);
  if (sprawdz == "030+")
    plik3 << tmp << endl;
} while (!plik.eof());
plik.close();

Czyli najpierw wczytuje linie, które mają owy początek, następnie z tego samego pliku wczytuje nagłówek (pierwsza linia), dopiero składa pierwsze i drugie wczytanie do kupy i zapisuje.

Ma to sens ??

edytowany 1x, ostatnio: Kremius
twonek
kiepskie nazwy zmiennych
EvilOne
  • Rejestracja:prawie 14 lat
  • Ostatnio:29 dni
  • Postów:78
0

wróć do Twojego pierwszego (lepszego rozwiązania) kodu źródłowego:

Kopiuj
while (!plik.eof())

zły warunek/źle sprawdzasz, czy przeczytałeś już cały plik. Tutaj wczytaj linię.

Kopiuj
plik2 << wiersze[i] << "\n";

interesującą Cię linię wczytujesz do innej zmiennej. wiersze[i] nie istnieje.

Kopiuj
string sprawdz = wiersz.substr(0, 4);
 
if (sprawdz == "030+")

z tym nieco przekombinowałeś. Można prościej.

NI
dlaczego zły warunek? ja tak robię i jest dobrze
EvilOne
eof będzie prawdziwe PO próbie czytania i napotkania końca pliku, nie zaraz po otwarciu.
NI
ciekawe... nie miałem tego problemu
NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

1.nie zamykasz pliku plik3
2.Jeśli substr zwraca stringa to sprawdzaj w ifie a nie zapisujesz tylko po to by sprawdzić
3.twój program w cale nie usuwa niechcianych lini tylko te chciane zapisuje do trzeciego pliku czyli twój program robi co innego niż napisałeś


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

OK. Jakie więc masz sugestie ??
Dodam, że te "oczyszczanie" chcę dodać do programu z tego teamtu

NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

jakie sugestie? żarty jakieś?
1.zamknij plik3 bo mogą być z tego powodu potem problemy
2.pomiń zapis do zmiennej i od razu sprawdzaj
3.zapisuj linie do vectora stringów a potem zastąp nimi orginalny plik, dzięki temu niechciane linie znikną.


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0
Niikelion napisał(a):

1.nie zamykasz pliku plik3
Wcale nie trzeba. Widziałem wręcz opinie mówiące, że nie należy, bo to jest zbędne i tylko śmieci kod.

2.Jeśli substr zwraca stringa to sprawdzaj w ifie a nie zapisujesz tylko po to by sprawdzić
Zapisanie tego do zmiennej o sensownej nazwie bardzo pomaga zrozumieć kod. Łatwiej ogarnąć dobryPrefix niż substr(0, 4)

3.twój program w cale nie usuwa niechcianych lini tylko te chciane zapisuje do trzeciego pliku czyli twój program robi co innego niż napisałeś
Język naturalny nie jest precyzyjny. Z kodu wynika, że on nie chce zmieniać początkowego pliku.

edytowany 1x, ostatnio: twonek
KR
sęk w tym, że chce zmienić plik początkowy, ale nie wiedziałem jak to zrobić, jednoczesny zapis i odczyt nie jest raczej możliwy
twonek
a, to zwracam honor a propos punktu 3
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0
twonek napisał(a):
Niikelion napisał(a):

1.nie zamykasz pliku plik3
Wcale nie trzeba. Widziałem wręcz opinie mówiące, że nie należy, bo to jest zbędne i tylko śmieci kod.

2.Jeśli substr zwraca stringa to sprawdzaj w ifie a nie zapisujesz tylko po to by sprawdzić
Zapisanie tego do zmiennej o sensownej nazwie bardzo pomaga zrozumieć kod. Łatwiej ogarnąć dobryPrefix niż substr(0, 4)

Nie rozumiem co masz na myśli.

Możesz podać przykład tego wektora, bo może i to śmieszne, ale pierwsze słyszę o czymś takim.

edytowany 1x, ostatnio: Kremius
twonek
ja tylko stwierdziłem, że sugestie @Niikeliona wcale nie są dobre
EvilOne
1) opinia mówi, że nie ma potrzeby zamykać (lepsza czytelność). 2) rezultat funkcji substr lepiej zapisać do dobrze opisanej zmiennej, a następnie ją użyć w ifie, niż bezpośrednio ją wywoływać (lepsza czytelność)
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0
twonek napisał(a):

Wcale nie trzeba. Widziałem wręcz opinie mówiące, że nie należy, bo to jest zbędne i tylko śmieci kod.

Niech będzie, że trzeba i dodałem.

Zapisanie tego do zmiennej o sensownej nazwie bardzo pomaga zrozumieć kod. Łatwiej ogarnąć dobryPrefix niż substr(0, 4)

coś takiego miałeś na myśli:

Kopiuj
do
    {
    	getline( plik, tmp );
    	if(tmp.substr(0,4)== "030+") plik3<<tmp<<endl;
	}
    while(!plik.eof());

Język naturalny nie jest precyzyjny. Z kodu wynika, że on nie chce zmieniać początkowego pliku.

Idea jest taka, żeby plik wejściowy do programu został "oczyszczony" z zbędnych linii zanim ten właściwy program będzie uruchomiony. Także ogólnie chodzi o to, aby plik po "oczyszczeniu" miał taką samą nazwę jak plik wczytany podczas oczyszczani. Czy wektorem można coś takiego uzyskać (jak już pisałem nie umiem nic z wektorów stąd prośba o jakiś example) ??

edytowany 1x, ostatnio: Kremius
NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

no to tak:
1.te dwie pierwsze rzeczy to sugestie, co z nimi zrobisz to twoja sprawa, inni mieli rację, czytelniej jest bez
2.

Kopiuj
vector<string>linie; 

i kiedy wczytasz linię do dodania do tego pliku to w tedylinie.push_back(linia do dodania)

Kopiuj
 i na koniec robisz pętle która zapisuje wszystkie linie do pliku(pamiętaj, że musisz go wcześniej zamknąć i otworzyć w trybie w którym tracisz dane które były w pliku)<code class="cpp">for (int i=0; i<linie.size(); i++) 

Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

OK. Dzięki, tylko jak zapisać dane będące "w wektorze" ??

twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
1

Pomijam sprawdzanie stanu strumieni itd.

Kopiuj
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    ifstream input("nazwa_pliku");
    string tmp;
    vector<string> goodLines;
    while (getline(input, tmp))
    {
        if (jakis_dobry_warunek_zostal_spelniony)
        {
            goodLines.push_back(tmp);
        }
    }
    input.close();

    ofstream output("nazwa_pliku");
    for (const auto& i : goodLines)
    {
        output << i << endl;
    }
}

twonek
nie wiem o co konkretnie pytasz, ale można, ten cały kod się kompiluje
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

Wielkie dzięki.
Zamiast "nazwa pliku" dać taką samą nazwę ?? Tak aby zmiany były zapisane w tym pliku, z którego zostały wczytane ??

NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

tak


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

twonek dałem twój kod wpisując swój warunek:

Kopiuj
if (tmp.substr(0,4)== "030+")

i mam coś takieg:

Kopiuj
23	22	[Error] ISO C++ forbids declaration of 'i' with no type [-fpermissive]
23	26	[Error] range-based 'for' loops are not allowed in C++98 mode
28		recipe for target 'main.o' failed
NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
1

jak masz już zapisane dane do wektora to otwierasz plik i

Kopiuj
for (int i=0; i<linie.size(); i++)
{
    plikwyjsciowy << linie[i] << endl;
} 

Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0

Nie masz C++11, to musisz użyć starej pętli:

Kopiuj
for (size_t i = 0; i < goodLines.size(); ++i)
{
    output << goodLines[i] << endl;
}
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0
twonek napisał(a):

Nie masz C++11, to musisz użyć starej pętli:

Kopiuj
for (size_t i = 0; i < goodLines.size(); ++i)
{
    output << goodLines[i] << endl;
}

Działa. Jeden tylko problem:
funkcja wygląda tak:

Kopiuj
void czyszczenie(const char * PLIK){
    ifstream input(PLIK);
    string tmp,HEADR;
    vector<string> goodLines;
    fstream wczytaj_HEADR (PLIK, ios::in);
    getline(wczytaj_HEADR, HEADR);
    while (getline(input, tmp))
    {
        if (tmp.substr(0,4)== "030+")
        {
            goodLines.push_back(tmp);
        }
    }
    input.close();
 
    ofstream output(PLIK);
    output<<HEADR<<endl;
    for (size_t i = 0; i < goodLines.size(); ++i)
	{
    	output << goodLines[i] << endl;
	}	
}

wywołanie jest praktycznie od razu jak wpiszę nazwę. A problem polega na tym, że po operacji "oczyszczenia" program nie "startuje' kończy działanie na powyższej funkcji, mimo, że dalej ma wczytywać (po sprawdzeniu, czy istnieje) program nic nie robi.

Małe pytanie, czy można usunąć znak, który Notepad++ wczytuje jako SUB (biały tekst w czarnej obwódce). Bo właśnie taki znak (polski znak, który Notepad wczytuje jako SUB) powoduje przerwanie programu (wczytuje wszystko, dopóki linia nie posiada takiego znaku

P.S Czy można zrobić tak, aby zapisując nie zostawiał na koniec pustego znaku ??

edytowany 2x, ostatnio: Kremius
NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

skoro wywala program na tym znaku to pewnie jest spoza zakresu char... niestety string to wektor charów więc musiałbyś innaczej wczytywać dane
więc tak da się to zrobić ale nie jest to proste


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
1

1.pokaż jak wykorzystujesz funkcję
2. da się:
plik << goodlines[i];

Kopiuj
if (i!=goodlines.size()-1)
{
    plik<<endl;
} 

Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0
Kopiuj
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);

    czyszczenie(PLIK.c_str());

    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());
    }
  }
}

Tego IF'a to muszę gdzie dać ??

Co do SUB zostaje ręczna zmiana ??

NI
a ten if to tam gdzie zapisujesz do pliku
NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

otwierasz plik, potem go otwierasz w funkcji... nie możesz dwukrotnie go otworzyć
to fstream plik daj po czyszczenie


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
edytowany 1x, ostatnio: Niikelion
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

Nie rozumiem. W main mam dwa razy otwarty ten sam plik ??

NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

nie... otwierasz plik w main a potem w czyszczenie... plik jest otwarty w main więc w czyszczenie wywali błąd


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
0

wstaw fstream plik po czyszczenie a nie przed


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

Faktycznie. Jak byś to inaczej zmienił. Bo w czyszczenie plik otwieram tylko w celu odczytania headera (pierwszej linii). Jest to bardzo potrzebne. Jak byś inaczej pobrał te wartość ??

NI
po co inaczej wczytać wartość? btw to nie zadeklarowałeś odczyt i format
KR
są zadeklarowane jako zmienne globalne, których tu nie widać
NI
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:535
1

... czy ty umiesz czytać????

Kopiuj
fstream plik(PLIK.c_str(),ios::in);
czyszczenie(PLIK.c_str()); 

tu otwierasz plik a potem w funkcji go znowu otwierasz...
zrób tak jak napisałem i zamień to na:

Kopiuj
czyszczenie(PLIK.s_ctr());
fstream plik(PLIK.c_str(), ios::in); 

Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
Zobacz pozostały 1 komentarz
NI
no to daj plusika temu kto pomógł i zamknij temat
NI
ewentualnie wszystkim XD
NI
przy odpowiedzi każdego użytkownika(nie ciebie) masz łapkę w górę i taki znaczek(prawa strona)... zaznacz ten znaczek przy odpowiedzi która jest rozwiązaniem a przy każdej wypowiedzi która ci pomogła zaznacz łapkę
NI
w tedy w liście tematów będzie od razu widać, że dyskusja skończona
KR
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 7 lat
  • Postów:260
0

Jeszcze jedna sprawa, znalazłem w internecie kod, który niby ma usuwać te znaki SUB. Pytanie jest jedno, co w nim jest nie tak (sprawdziłem i nie działa). Oto kod:

Kopiuj
using(FileStream f = File.OpenRead("plik.txt"))
{
  using(StreamReader sr = new StreamReader(f)) {
    string text = sr.ReadToEnd();
    text = text.Replace("\u001a", string.Empty);
  }
}
edytowany 1x, ostatnio: Kremius
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)