Noob pisze edytuj txt: wczytaj stary - wprowadź zmianę - wypluj nowy

Noob pisze edytuj txt: wczytaj stary - wprowadź zmianę - wypluj nowy
HY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Cel postu:
Pokazanie mojego procesu tworzenia programu z nadzieją, że jak gdzieś ugrzęznę, to łaskawa dusza rzuci mi linę, albo łopatę, bym wygrzebał się sam. Takie obraz tego, co ledwo raczkuje, a chce już biegnąć z motyką na Słońce.

Cel programu:
Plan maksimum zakłada, że z pliku szynka.txt po wpisaniu linijek w EXE wypluje wynik w mielonka.txt.
Przykład:
plik z pliku szynka.txt

Kopiuj
Ala
Magdalenka

wypluje plik mielonka.txt

Kopiuj
Mała Ala zjadła kota
Ala pojechała na imprezę
Niesamowita Ala wywija na parkiecie
Mała Magdalenka zjadła kota
Magdalenka pojechała na imprezę
Niesamowita Magdalenka wywija na parkiecie

Plan napisania programu... ze znikomą znajomością programowania:

Kopiuj
1a,1z,2a,2z,3a,3z,mid:
p,w:
Otwórz maszynka.exe
Wprowadź tekst przed pierwszym zdaniem (1a)
Wprowadź tekst po pierwszym zdaniu (1z)
Wprowadź tekst przed drugim zdaniem (2a)
Wprowadź tekst po drugim zdaniu (2z)
Wprowadź tekst przed trzecim zdaniem (3a)
Wprowadź tekst po trzecim zdaniu (3z)

zapisz p=1
Pętla
Wczytaj p linijkę tekstu z szynka.txt i nazwij (mid)
  1a+mid+1z=w
  zapisz w (wiersz) w mielonka.txt
  2a+mid+2z=w
  zapisz w (wiersz) w mielonka.txt
  3a+mid+3z=w
  zapisz w (wiersz) w mielonka.txt
  jeżeli mid=(brak) to przerwij pętle
  p=p+1
Koniec pętli

Ale, jak na razie, utknąłem na tym:

Kopiuj
program ma_szynka;
var F:Text;
    1a,1z,2a,2z,3a,3z,mid:string;
	p,w:integer;
begin
  write('Wprowadź tekst przed pierwszym zdaniem (1a)');
  read(1a);
  write('Wprowadź tekst po pierwszym zdaniu (1z)');
  read(1z);
  write('Wprowadź tekst przed drugim zdaniem (2a)');
  read(2a);
  write('Wprowadź tekst po drugim zdaniu (2z)');
  read(2z);
  write('Wprowadź tekst przed trzecim zdaniem (3a)');
  read(3a);
  write('Wprowadź tekst po trzecim zdaniu (3z)');
  read(3z);
  
  writeln(1a+1z);
  writeln(2a+2z);
  writeln(3a+3z);
  readln();
end.
Kopiuj
generator.pas(3,5) Fatal: syntax error,  "BEGIN" expected but" ordinal const" found
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Masz jakiś problem z Wczytaj p linijkę tekstu z szynka.txt i nazwij (mid)?

HY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
_13th_Dragon napisał(a):

Masz jakiś problem z Wczytaj p linijkę tekstu z szynka.txt i nazwij (mid)?

Nawet do tego jeszcze nie dotarłem. Wyskakuje mi w "Free Pascal":
generator.pas(3,5) Fatal: syntax error, "BEGIN" expected but" ordinal const" found
dla codu:

Kopiuj
program ma_szynka;
var F:Text;
    1a,1z,2a,2z,3a,3z,mid:string;
	p,w:integer;
begin
  write('Wprowadź tekst przed pierwszym zdaniem (1a)');
  read(1a);
  write('Wprowadź tekst po pierwszym zdaniu (1z)');
  read(1z);
  write('Wprowadź tekst przed drugim zdaniem (2a)');
  read(2a);
  write('Wprowadź tekst po drugim zdaniu (2z)');
  read(2z);
  write('Wprowadź tekst przed trzecim zdaniem (3a)');
  read(3a);
  write('Wprowadź tekst po trzecim zdaniu (3z)');
  read(3z);
  
  writeln(1a+1z);
  writeln(2a+2z);
  writeln(3a+3z);
  readln();
end.
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
4

Nazwy zmiennych nie mogą się zaczynać od cyfr. :P

HY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
furious programming napisał(a):

Nazwy zmiennych nie mogą się zaczynać od cyfr. :P

A ja po internecie biegam, jakieś dodatkowe begin i endy wpisuję. xD
Jest progres! Dzięki!

Kopiuj
program ma_szynka;
uses crt;
var
	F:Text;
    t1a,t1z,t2a,t2z,t3a,t3z,mid:string;
	p,w:integer;
begin
mid:='Ala';
  writeln('Wprowadź tekst przed pierwszym zdaniem (t1a)');
  readln(t1a);
  writeln('Wprowadź tekst po pierwszym zdaniu (t1z)');
  readln(t1z);
  writeln('Wprowadź tekst przed drugim zdaniem (t2a)');
  readln(t2a);
  writeln('Wprowadź tekst po drugim zdaniu (t2z)');
  readln(t2z);
  writeln('Wprowadź tekst przed trzecim zdaniem (t3a)');
  readln(t3a);
  writeln('Wprowadź tekst po trzecim zdaniu (t3z)');
  readln(t3z);
  
  writeln(t1a+' '+mid+' '+t1z);
  writeln(t2a+' '+mid+' '+t2z);
  writeln(t3a+' '+mid+' '+t3z);
  readln(mid);
end.
HY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

To się dowiedziałem, że ridlowanie istnieje i, że podświetlanie coś znaczy. Zawsze nowa wiedza. Dzięki!

Kod mi już ładnie wypluwa tekst z jednego txt do drugiego, ale tylko z pierwszej linii notatnika.

Ogólnie pytania mam dwa:

  1. Czy do konsoli można sprawić, by wyświetlały się polskie znaki? Czy przenieść się na inny program do programowania(sic!)? Free Pascal wybrałem, bo wieki temu polizałem Hello World i kalkulator w tym języku. To wiedza mi wyparowała, a umysł już nie taki giętki.
  2. Jakie jest polecenie/kod, by z pliku txt wczytało dane z konkretnej linijki? Coś się z Google nie potrafię dogadać.
Kopiuj
program ma_szynka;
uses crt;
var
	F,G:Text;
    t1a,t1z,t2a,t2z,t3a,t3z,mid,out1,out2,out3:string;
	p,w:integer;
begin
ClrScr;
 Assign(F, 'szynka.txt');
 Reset(F);
 ReadLn(F, mid);

//szybkie przykładowe "przed" i "po" środkowym tekscie
t1a:=('t1a');
t1z:=('t1z');
t2a:=('t2a');
t2z:=('t2z');
t3a:=('t3a');
t3z:=('t3z');

//Wyświetl winik w konsoli
  writeln(t1a+' '+mid+' '+t1z);
  writeln(t2a+' '+mid+' '+t2z);
  writeln(t3a+' '+mid+' '+t3z);

// "suma" winików
  out1:=(t1a+' '+mid+' '+t1z);
  out2:=(t2a+' '+mid+' '+t2z);
  out3:=(t3a+' '+mid+' '+t3z);

 Assign(G, 'mielonka.txt');
 Rewrite(G);
// zapisz sumę do pliku
 WriteLn(G, out1);
 WriteLn(G, out2);
 WriteLn(G, out3);
 close(G);
 
 close(F);
 writeln('wciśnij enter, by zakończyć:');
 readln;
end.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
2
Hydrosofista napisał(a):
  1. Czy do konsoli można sprawić, by wyświetlały się polskie znaki?

Skorzystaj z funkcji SetConsoleOutputCP(CP_UTF8) (tutaj masz przykład). U mnie działa, choć te chińskie symbole (w ostatniej linijce) nie wyświetlają się. Pewnie font używany w mojej konsoli nie posiada tych znaków:

screenshot-20221029142955.png

  1. Jakie jest polecenie/kod, by z pliku txt wczytało dane z konkretnej linijki? Coś się z Google nie potrafię dogadać.

Nie da się tego zrobić w jednym kroku, dlatego że nie wiadomo w którym miejscu w pliku tekstowym znajduje się pierwszy bajt linijki o zadanym indeksie. Da się obliczyć numer bajtu tylko wtedy, gdy każda linijka tego pliku zajmuje tyle samo bajtów, a to raczej jest bardzo rzadko spotykane. Przy czym mowa o długości linijek w bajtach, nie w znakach, bo przy plikach kodowanych np. w UTF-8, niektóre znaki będą jednobajtowe (zakres ASCII), a pozostałe wielobajtowe (jak np. polskie znaki diakrytyzowane).

Jeśli Twój plik tekstowy ma linijki o różnej długości i chcesz załadować do zmiennej konkretną linię, to musisz do niej dotrzeć w pętli. Czyli w kółko odczytujesz linijki i je zliczasz, a kiedy dotrzesz do tej o zadanym indeksie to przerywasz pętlę.

HY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

O cholibka:
Po dodaniu SetConsoleOutputCP(CP_UTF8) w konsoli pojawiają się polskie znaki, ale jak wczytuje z txt, to z ąbćłóęńźż robi bő'ƈt".
Jeżeli jest problem z wczytaniem konkretnej linijki z txt, to..
to wczytywanie z txt sobie odpuszczę..
ALE!
Nie jestem kontent! :D

Może, jak wszystko będzie wewnątrz programu, to osiągnę zamierzony wynik. Przy pomocy Lazarusa. By z Memo (pola tekstowego, jak ktoś jak ja może nie wiedzieć) wczytać linijki.
Tylko czy z memo można czytać linijki? (choć to poprawnie się chyba nazywa index)

Na razie sam szkic aplikacji, jaki sobie wyobrażam:
image
Kod wrzucę, jak się nauczę, napiszę i oczywiście nad czymś mocno utknę.

P.S.
Chyba lepszą opcją jest w temacie pierwszego postu dodać tag Lazarus a z tytułu "Noob pisze edytuj txt: wczytaj stary - wprowadź zmianę - wypluj nowy" zamienić "txt" na "tekst". Niż zakładanie nowego tematu. Nie chcę robić bałaganu na forum, a tu Was jeszcze moim programowaniem chętnie pomęczę.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
0
Hydrosofista napisał(a):

Po dodaniu SetConsoleOutputCP(CP_UTF8) w konsoli pojawiają się polskie znaki, ale jak wczytuje z txt, to z ąbćłóęńźż robi bő'ƈt".
Jeżeli jest problem z wczytaniem konkretnej linijki z txt, to..

Lazarus (a raczej FPC) domyślnie obsługuje ciągi znaków kodowane w UTF-8, więc Twój plik tekstowy również musi zawierać dane zapisane przy użyciu tego kodowania. Jeśli plik zawiera tekst w innym kodowaniu, to po wczytaniu linijki do zmiennej typu String, należy jej zawartość przekonwertować na inne kodowanie. Ale to raczej bez sensu, skoro UTF-8 jest wręcz standardem — nawet systemowy notatnik domyślnie proponuje zapis dokumentu w UTF-8.

HY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
furious programming napisał(a):
Hydrosofista napisał(a):

Po dodaniu SetConsoleOutputCP(CP_UTF8) w konsoli pojawiają się polskie znaki, ale jak wczytuje z txt, to z ąbćłóęńźż robi bő'ƈt".
Jeżeli jest problem z wczytaniem konkretnej linijki z txt, to..

Lazarus (a raczej FPC) domyślnie obsługuje ciągi znaków kodowane w UTF-8, więc Twój plik tekstowy również musi zawierać dane zapisane przy użyciu tego kodowania. Jeśli plik zawiera tekst w innym kodowaniu, to po wczytaniu linijki do zmiennej typu String, należy jej zawartość przekonwertować na inne kodowanie. Ale to raczej bez sensu, skoro UTF-8 jest wręcz standardem — nawet systemowy notatnik domyślnie proponuje zapis dokumentu w UTF-8.

Nie doprecyzowałem.
Obecny kod pisany na Free Pascal przerzuciłem na Lazarus.
Polskie znaki na konsoli wyświetlają się dobrze, gdy są ze skryptu, lecz jak wyświetlają zawartość dokumentu, to się krzaczy.

szynka.txt kodowany w UTF-8

Kopiuj
ąbćłóęńźż

program:

Kopiuj
program project_01;
uses windows;
var
	F,G:Text;
    t1a,t1z,mid,out1:string;
        PreviousValue: UINT;
begin
// ClrScr;
 {$IFDEF WINDOWS}
   PreviousValue := GetConsoleOutputCP;
   SetConsoleOutputCP(CP_UTF8);
 {$ENDIF}

 Assign(F, 'szynka.txt');
 Reset(F);
 ReadLn(F, mid);

//szybkie przykładowe "przed" i "po" środkowym tekscie
t1a:=('t1a');
t1z:=('t1z');

//Wyświetl winik w konsoli
  writeln(t1a+' '+mid+' '+t1z);
// "suma" winików
  out1:=(t1a+' '+mid+' '+t1z);
 Assign(G, 'mielonka.txt');
 Rewrite(G);
// zapisz sumę do pliku
 WriteLn(G, out1);
 close(G);

 close(F);
 writeln('wciśnij enter, by zakończyć:');
 writeln('znaki z kodu: ąbćłóęńźż');
 write('znaki wczytane z mielonka.txt: ');
 write(mid);
 readln;
 {$IFDEF WINDOWS}
   SetConsoleOutputCP(PreviousValue);
 {$ENDIF}
end.       

wynik w konsoli:

Kopiuj
t1a bő'ƈt" t1z
wciśnij enter, by zakończyć:
znaki z kodu: ąbćłóęńźż
znaki z mielonka.txt: bő'ƈt"

wynik w mielonka.txt kodowany w UTF-8

Kopiuj
t1a ąbćłóęńźż t1z
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12316
0

Dodaj na początek kodu dyrektywy, które normalnie powinne się tam znajdować:

Kopiuj
program project_01;

{$MODE OBJFPC}{$H+} // dodaj tę linijkę

uses windows;
// tu reszta kodu
HY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

HAHAHA xD Problem rozwiązany, myślę, że temat można zamknąć. xD
Jednak chętnie się jeszcze dowiem, czy doświadczony programista płakał, jak kompilował / czytał. :D
Kod, którym osiągnąłem swój cel:

Kopiuj
program project_01;
{$MODE OBJFPC}{$H+} // dodaj tę linijkę
uses windows, Unit1;
var
	F,G:Text;
    t1a,t1z,mid,out1:string;
        PreviousValue: UINT;
        p:int64;
begin
// ClrScr;
 {$IFDEF WINDOWS}
   PreviousValue := GetConsoleOutputCP;
   SetConsoleOutputCP(CP_UTF8);
 {$ENDIF}
p:=3;

  repeat
     writeln('=Arkusz1!A$',p);
     writeln('=Arkusz1!A$',p);
     writeln('=Arkusz1!A$',p);
     p:=p+1;
  until p=103;

 readln;
 {$IFDEF WINDOWS}
   SetConsoleOutputCP(PreviousValue);
 {$ENDIF}
end.

Łącząc z excelem, dało radę. :D

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2

Wywalając wszystko co nie ma sensu:

Kopiuj
program project_01;
var p,k:Integer;
begin
  for p:=3 to 102 do for k:=1 to 3 do writeln('=Arkusz1!A$',p);
end.

Wychodzi 5 (z których 3 są nieuniknione) zamiast 28 wierszy

Hydrosofista napisał(a):

Łącząc z excelem, dało radę. :D

Doprawdy?
Albo w Arkusz2!A1 wpisać: =INDEKS(Arkusz1!A:A;ZAOKR.DÓŁ((WIERSZ()-1)/3+4;0);1) i rozciągnąć (ewentualnie metoda Kopiego Pejsta) na 300 wierszy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.