Otwieranie pliku i dziwny błąd

0

Witam
Nie wiem dlaczego ale w tym programie pojawia się błąd Error 103 (plik nie otwarty)
Nie mam pojęcia dlaczego tak się dzieje, wydawało mi się że jest wszystko w porządku a tutaj taki bug

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tkonwerterbazy = class(TForm)
    konwertuj: TButton;
    anuluj: TButton;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    procedure anulujClick(Sender: TObject);
    procedure konwertujClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  konwerterbazy: Tkonwerterbazy;

implementation

{$R *.dfm}

procedure Tkonwerterbazy.anulujClick(Sender: TObject);
begin
close;
end;

procedure Tkonwerterbazy.konwertujClick(Sender: TObject);
var
sciezka:string;
inplik:TextFile;
outplik:textFile;
//wersin: array [1..340] of string;
wersout,wersin:string[100];
round:string[2];
sep:array [1..6] of integer;
i,j,k:integer;
begin
if OpenDialog1.Execute then  // tworzenie sciezki do bazy danych
sciezka:=OpenDialog1.Filename;
AssignFile(inplik, sciezka);
reset(inplik);
Insert('new',sciezka,length(sciezka)-4);

i:=1;
j:=2;
{for k:=1 to 340 do
  }

AssignFile(outplik,sciezka);
ReWrite(outplik);
for k:=1 to 340 do
begin
  Readln(inplik, wersin[k]);
  if ord(wersin[1]) < 53 then
  begin
    round[1]:= wersin[1];
    round[2]:= wersin[2];
  end
  else
  begin
    wersout[1]:= round[1];
    wersout[2]:= round[2];
    for i:=1 to length(wersin) do
    begin
      if wersin[i] = '-' then sep[1]:=i;
      if ord(wersin[i]) = 9 then
      begin
        sep[j]:=i;
        j:=j+1;
      end;
    end;
    move(wersin[1],wersout[3],sep[1]);
    move(wersin[sep[1]+1],wersout[22],sep[2]-sep[1]);
    move(wersin[sep[2]+1],wersout[42],3);
    move(wersin[sep[3]+1],wersout[45],4);
    move(wersin[sep[4]+1],wersout[49],4);
    move(wersin[sep[5]+1],wersout[53],4);
    move(wersin[sep[6]+1],wersout[57],10);
    writeln(outplik,wersout);               //tutaj wyskakuje bład 103 czyli plik nie otwarty do odczytu
    for i:=1 to length(wersout) do
      wersout[i]:=' ';

  end;


end;
closeFile(outplik); //ale tutaj wyskakuje błąd zależy od widzimisie programu
closeFile(inplik);
end;

end.

Prosił bym o pomoc w znalezieniu przyczyny problemu .</quote>

0

wykomentuj linijki z wywołaniem move, prawdopodobnie przesuwasz coś za daleko i nadpisujesz inne zmienne, w tym te od plików.

0

to samo, niestety
wg mojej wiedzy move nie ma nic wspólnego z tym błędem co mi się pojawia. Chociaż mogę się mylić ;/

0

Wygląda mi to podejrzanie. Już raz otworzyłes plik i ustawiłeś wskaźnik na początku pliku reset(), a potem znowu używasz AssignFile() na już otwartym pliku... Prawdopodobnie za tym drugim razem była odmowa dostępu do już otwartego pliku i dostałeś taki komunikat i outplik nie został otwarty.

0

a są otwarte te pliki do odczytu ?
ogólnie to zakomentowaną masz definicję wersin

//wersin: array [1..340] of string;

która ustawiała chyba tablicę z 340 elementami typu string
a zmieniłeś to na

wersout,wersin:string[100];

gdzie jest definiowane zdaje się całkiem co innego a dokładnie string o długości 100 znaków
potem więc wczytujesz do pojedynczego znaku całą linijkę:

Readln(inplik, wersin[k]);

potem do rounda dopisujesz jakieś wartości

round[2]:= wersin[2];

a wersin[2] tak na moje będzie cały czas takie samo i ustawi się dopiero przy k = 2, przy k = 1 będzie jakiś losowy znaczek a potem tutaj będzie znak który jest w drugiej linijce pliku wejściowego

a potem zaś operujesz na jakichś dalekich indeksach znaków w stringu wersout poza zdaje się długością tego stringa
nie wiem co chcesz uzyskać ale tak na moje co by to nie było to ten kod tego nie zrobi (ale mogę się mylić)

@markac: co ty mówisz ? przyjrzyj się kodowi

0

hmmm z tym wykomendowaniem tej tablicy stringów było tak że chciałem zrobić buffor do konwertowania i kopiowania między inplik i outplik ale potem z tego zrezygnowałem i dlatego jest tak komentarz

Uznałem że lepszą drogą będzie pobranie całego wersu i operowanie na nim

Nigdy nie przekraczam wartości tego stringa poza tym nawet jak bym przekraczał to byłby całkowicie inny komunikat niż Error 103

Próbowałem zamiast writeln(outplik,wersout) dać writeln(outplik,'qqq') i wyskoczył ten sam błąd

Ja już teraz nie mam pojęcia co może być nie tak , moja wiedza sie skończyła :(((

0

On a new computer store and the Clintons are an invention is complete and one

a teraz to samo po polsku*:
ale nie pobierasz całej linijki tylko jeden znak, a nie wiem czemu wyskakuje ten błąd, spróbuj debugować

... i zobaczyć czy wsżędzie wcześniej jest dobrze a najlepiej to skracaj kod do najkrótszej postaci która nie działa i dopiero ją podaj na forum
i czy ten plik który wybierasz nie jest na jakimś chronionym nośniku ?

*Vista's Voice recognition twierdzi że to tak samo brzmi, chociaż "an invention" całkiem całkiem jak "A nie wiem czemu"

0

coście się tak wszyscy uwzięli ? przecież tu otwierane są dwa różne pliki ! czemu się wam one rzucają na oczy ? wy chyba jesteście jakimiś maniakami nadużywania zmiennych ! skoro zmiennej sciezka się potem nie wykorzystuje to na chusteczkę tworzyć nową zmienną jak można tylko wstawić parę znaków ?

sciezka := 'c:\folder\plik.txt';

AssignFile(inplik, sciezka); // otworzenie pliku c:\folder\plik.txt do inplik
reset(inplik); // ustawienie wskaźnika na początku pliku
Insert('new',sciezka,length(sciezka)-4); // dodaniu do zmiennej sciezka ciągu "new"
// tutaj zmienna sciezka już się równa c:\folder\plinewk.txt (chyba autor miał na myśli  -3 no ale to już jego wybór)

i:=1; // whatever
j:=2;

AssignFile(outplik,sciezka); // otworzenie pliku c:\folder\plinewk.txt do outplik
ReWrite(outplik); // stworzenie/wyczyśczenie pliku i ustawienie wskaźnika na jego początku

gdzie wy tu wszyscy widzicie otwieranie dwa razy tego samego pliku ? a pliki są zamykane na końcu kodu, co wam tu źle ? doczepiliście się do jedynej słusznej części kodu

dalej uważam że autor całkowicie posmerał kod, robisz w uproszczeniu coś takiego:

var f: TextFile; a, b: char;
begin
  AssignFile(f, 'plik');
  Reset(f);
  ReadLn(f, a);
  ReadLn(f, b);

i załóżmy że plik zawiera takie dane:

abc
xyz

to zmienna "a" będzie zawierała literkę "a", a zmienna "b" będzie zawierała co ? no oczywiście że nie "b" tylko "x" !!!! wczytujesz całą linię do jednego znaku !

jeśli nie widzisz związku ze swoim kodem to zauważ że

a: string[100];

to prawie że to samo co:

a: array[1 .. 100] of char;

napisz co chcesz uzyskać, jak wygląda plik wejściowy i coś się zobaczy a tak to nawet z tego kodu nie można wywnioskować co on ma robić

0

OK dzięki za pomoc znalazłem błąd
błąd był w deklaracji zmiennej wersout
sprawdziłem empirycznie że nie może tam być string[100] bo program się wysypuje

Dzięki za wszelką pomoc i naprowadzenie mnie na to.

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