Konwertowanie plików txt na dxf.

0

Witam, muszę napisać program, który będzie konwertował plik txt na dxf (autocad), jednak programowanie to nie jest moją mocną stroną. Wyskakuje mi, że projekt został poprawnie zbudowany lecz gdy klikam na "konwertuj" odzywa się debuuger na linijce ile:=strtoint(s); i mówi "Project project1 raised exception class 'EconverError' with message: liczba puntkow 3 is an invalid integer"

Mój plik txt wygląda tak:

liczba punktow 3
x1 0
y1 0
x2 100
y2 100
x3 100
y3 0
liczba punktow 4
x1 50
y1 50
x2 20
y2 20
x3 20
y3 50
x4 50
y4 20
liczba punktow 3
x1 15
y1 40
x2 90
y2 10
x3 90
y3 74

zaś "program", który napisałam tak:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls;

type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
f,g:textfile;
s:string;
x1,y1,ile,xn,yn,i:integer;

begin
assignfile(f,'dzialki.dxf');
Rewrite(f);
Writeln(f,'0');
Writeln(f,'SECTION');
Writeln(f,'2');
Writeln(f,'HEADER');
Writeln(f,'9');
Writeln(f,'$ACADVER');
Writeln(f,'1');
Writeln(f,'AC1027');
Writeln(f,'9');
Writeln(f,'$ACADMAINTVER');
Writeln(f, '70');
Writeln(f, '8');
Writeln(f, '9');
Writeln(f,'$DWGCODEPAGE');
Writeln(f,'3');
Writeln(f,'ANSI_1250');
Writeln(f,'$LASTSAVEDBY');
Writeln(f, '1');
Writeln(f,'ENDSEC');
Writeln(f,'ENTITIES');
assignfile(g,'dzialki.txt');
reset(g);
repeat
readln(g,s);
ile:=strtoint(s);
readln(g,s);
x1:=strtoint(s);
readln(g,s);
y1:=strtoint(s);
image1.canvas.MoveTo(x1,y1);
for i:=2 to ile do
begin
readln(g,s);
xn:=StrToint(s);
readln(g,s);
yn:=StrToint(s);
Image1.Canvas.LineTo(xn,yn)
end;
Image1.Canvas.LineTo(x1,y1);
until eof (g);
writeln(f,'0');
writeln(f,'ENDSEC');
writeln(f,'0') ;
writeln(f,'EOF');
closefile(f);
closefile(g);
end;

end.
until ;

end;

end.

Może ma ktoś, jakiś pomysł co tu jest źle i jak to naprawić ? Z góry dziękuję za pomoc !

0

i mówi "Project project1 raised exception class 'EconverError' with message: liczba puntkow 3 is an invalid integer"

A czego w tym komunikacie nie rozumiesz? :|

0

Mam pomysł. To nawet logicznie. Wartość liczba punktow i dalej cokolwiek nawet liczba, na pewno taką liczbą nie jest. Musiał byś robić coś w stylu spawdzenia funkcją Pos czy w zmiennej S znajduje się tekst 'liczba punktow '. Jeżeli tak (czyli funkcja Pos wtedy zwraca liczbę większą od 0) to funkcją Copy zrobić dla zmiennej S później jako drugi parametr Pos(liczba punktow , S) + Length('liczba punktow ');, na końcu MaxInt i dopiero dla tak skopiowanego ciągu o ile będzie on faktycznie zawierał tylko prawidłową liczbę całkwitą funkcja StrToInt nie zwróci błędu. Zawsze można też użyć pod VCL funkcji TryStrToInt. A pytania o takie banalne podstawy na przyszłość zadawaj w dziele Newbie. A i do operacji na plikach lepiej sobie, skoro i tak piszesz pod VCL i korzystasz z jego dobrodziejstw, pomóć zarówno w odczycie, jak i dopisywaniu zawartości oraz zapisywania do pliku, klasą TStringList. Więćej informacji znajdziesz w pomocy Delphi i oczywiście w Google.

0

przepraszam bardzo, faktycznie powinnam zadać tam pytanie, bo jestem zupełnym laikiem jeśli chodzi o programowanie, ale czy mogę mieć do Ciebie prośbę o rozpisanie tego, bo nie za bardzo wiem o co chodzi... :(

0

Nie wiem co mam Tobie rozpisać, bo nie wiem jak powinien poza plikiem wejściowym wyglądać dla niego jakiś przykladowy plik wyjściowy. Poza tym nauczony ostatnim przypadkiem nie mam co dawać gotowca. Po prostu się tak Was pytających na prawdę krzywdzi. Ponieważ nic się sami nie uczycie, a rodzą się Wam kolejne pytania i problemy, które po poznaniu podstaw oraz samodzielnym kombinowaniu, według mnie z pewnością by się już nie pojawiały. Polecam poczytanie o tym jak używać i do czego służą funkcje Pos, Copy, Length, ewentualnie Delete oraz StrToInt czy TryStrToInt i będziesz wiedział jak prawidłowo napisać taki kod. Pokombinuj. Przykład podałem. Po prostu ten bład, o którym piszesz na początku wynika z tego, o czym później wspomniałem. Zmienna typu string do prawidłowej konwersji przy użyciu StrToInt czy nawet TryStrToInt musi zawierać w łancuchu od pierwszego znaku prawidlową liczbę całkowitą. Jak widzisz w komunikacie tekst liczba puntkow 3 na pewno prawidlową liczbą od pierwszego znaku nie jest. Przynajmniej dla kompilatora, a w zasadzie na logikę również nie jest :) Natomiast wspomniane funkcje i dokonane nimi operacje, pozwolą Tobie z wejściowej linijki tekstu w pliku, wyodrębnić samą właściwą liczbę do dalszych operacji i nie otrzymywać komunikatów o błedach konwersji.

0

@olesio bardzo dużo kombinowania z Pos(); Copy(); i innymi. Wystarczy że użyje Val.

0

Już pomijam fakt, że kod jest niesamowicie nieczytelny i panuje w nim haos, ale otrzymując od debugera wyjątek: EConvertError with message 'liczba punktów 3' is not a valid integer value (ten akurat pod D7) powinnaś się domyślić, że faktycznie łańcuch liczba punktow 3 nie jest liczbą; Cała pętla wczytująca punkty jest skopana:

repeat
  readln(g,s);
  ile:=strtoint(s);
  readln(g,s);
  x1:=strtoint(s);
  readln(g,s);
  y1:=strtoint(s);

jakim niby cudem ma to działać..? Znasz przecież zawartość pliku - weźmy pod uwagę pierwszą sekcję:

liczba punktow 3
 x1 0
 y1 0
 x2 100
 y2 100
 x3 100
 y3 0

patrząc na kod i wykorzystując wbudowany w korę mózgową debuger można zobaczyć, że:

  • pierwszy ReadLn(g, s) wczyta linię liczba punktow 3 i nie da rady jej zamienić na liczbę,
  • drugi ReadLn(g, s) wczytałby linię x1 0 i nie zamieniłby jej na liczbę,
  • trzeci ReadLn(g, s) wczytałby linię y1 0 i także nie zamieniłby jej na liczbę;
    Więc w jaki sposób ten kod ma działać? Nie dziw się więc, że kod nie działa bo nie ma prawa działać;

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