zapis rekordu do pliku

0

Zajrzałem tu http://4programmers.net/article.php?id=11
bo myślałem że coś źle robie ale okazało się że jest dobrze przynajmniej się kompiluje jednak

type
    Tfaq = packed record
     tytul : string[125];
     tresc : string[125];
    end;

    Tplik = file of Tfaq; 

 var plik : Tplik;
       faq : Tfaq;

 const FileName = 'dane/baza.dat'; 

 begin
    AssignFile(plik, FileName);
    if not fileexists(filename) then
    rewrite(plik) else
    Reset(plik);
    Seek(plik, FileSize(plik)); 
    faq.tytul :=form2.edit1.text;
    faq.tresc := form2.memo1.lines.text;
    write(plik, faq);
    closeFile(plik); 
    end;

prezy próbie otwarcia pliku lub jego stworzenia wywala błąd I/O error 183

0

jejq.. a co to za ścieżka.. data/baza.dat ... widziałeś kiedyś taką ? ;-)

0

jejq.. a co to za ścieżka.. data/baza.dat ... widziałeś kiedyś taką ? ;-)

ExtractFilePath(Application.ExeName) + FileName;

i mamy ścieżkę :)

0

jejq.. a co to za ścieżka.. data/baza.dat ... widziałeś kiedyś taką ? ;-)

ExtractFilePath(Application.ExeName) + FileName;

i mamy ścieżkę :)

moim skromnym zdaniem to nie ma znaczenia bo przy uruchomieniu sprawdzam czy jest katalog dane jak go nie ma to go tworze i jak jest katalog to plik powinien sie tam stworzyć błąd wywala w momencie

rewrite(plik) else <-- najczęsciej tu
Reset(plik);

nawet jak wpisałem 'c:\data.dat' to i tak jest ten sam błąd I/O error 183

0

Waldi a może \ zamiast / ? I od razu uwaga: zapis packed recordu bedzie bledny, nie uzywaj packed jesli chcesz zapisywac to na dysk.

0

Waldi a może \ zamiast / ? I od razu uwaga: zapis packed recordu bedzie bledny, nie uzywaj packed jesli chcesz zapisywac to na dysk.

to / czy\ jest to samo packed rekord czy rekord nic też nie zmienia ma ktoś jakiś inny pomysł

0

Waldi a może \ zamiast / ? I od razu uwaga: zapis packed recordu bedzie bledny, nie uzywaj packed jesli chcesz zapisywac to na dysk.

to / czy\ jest to samo packed rekord czy rekord nic też nie zmienia ma ktoś jakiś inny pomysł

Może po prostu plik ma ustawiony atrybut "tylko do odczytu"?

0

Może po prostu plik ma ustawiony atrybut "tylko do odczytu"?

Plik nie ma atrybutu ponieważ jak nie ma pliku to się dzieje to samo
nawet jak zrobie bez sprawdzania czy plik istnieje


 begin
    AssignFile(plik, FileName);
    Reset(plik);
    Seek(plik, FileSize(plik)); 
    faq.tytul :=form2.edit1.text;
    faq.tresc := form2.memo1.lines.text;
    write(plik, faq);
    closeFile(plik); 
    end;
</delphi>
0

To na pewno jest błąd I/O 183?

I użyj zwykłego typu rekordowego, a nie packed record.

0

Zajrzałem wreszcie do Delphi 4. VP :) i oto co znalazłem. Błąd ERROR_ALREADY_EXISTS (nr 183, bo kody błędów I/O to kody błędów Win32), jak można się domyślić, oznacza: próba utworzenia pliku już istniejącego :) . Ponadto, zmień warunek instrukcji warunkowej, aby częściej miał on wartość True jak False:

if FileExists(FileName) then
  Reset(Plik)
else
  Rewrite(Plik);
0

Zajrzałem wreszcie do Delphi 4. VP :) i oto co znalazłem. Błąd ERROR_ALREADY_EXISTS (nr 183, bo kody błędów I/O to kody błędów Win32), jak można się domyślić, oznacza: próba utworzenia pliku już istniejącego :) . Ponadto, zmień warunek instrukcji warunkowej, aby częściej miał on wartość True jak False:

if FileExists(FileName) then
  Reset(Plik)
else
  Rewrite(Plik);

wywaliłem packed napisałem jw i nic nadal to samo plik powstaje i jest otwarty (wnioskuje po tym że nie można go usunąć jak jest uruchomiony program), Jak już go usunę (po zamknięciu programu) też jest to samo
A najlepsze jest to że po ponwnym kliknięciu na buton zapisuje mi do pliku dane

0

A wstaw jeszcze po AssignFile() słowo try, a CloseFile() weź w finally. Przynajmniej zamknie plik nawet jak będzie bug i usuniesz go podczas pracy programu :)

0

A wstaw jeszcze po AssignFile() słowo try, a CloseFile() weź w finally. Przynajmniej zamknie plik nawet jak będzie bug i usuniesz go podczas pracy programu :)

niestety zawsze zatrzymuje sie na rewrite

mam tak

type
 Tfaq =  record
  tytul : string[125];
  tresc : string[125];
 end;
 Tplik = file of Tfaq; 
 var plik : Tplik; 
      faq : Tfaq;
  const filename='c:\plik.dat';

begin
    AssignFile(plik, FileName);
    try
    if FileExists(FileName) then
    Reset(Plik)
    else
    Rewrite(Plik);
    Seek(plik, FileSize(plik));
    faq.tytul :=form2.edit1.text;
    faq.tresc := form2.memo1.lines.text;
    write(plik, faq); 
    finally
    closeFile(plik); 
     end;
    end

i wiecznie ten sam błąd

0

A co się dzieje jeżeli uruchomisz skompilowanego exe-ka (tzn. uruchomisz program spoza Delphi) ? Też wyskakuje błąd ?
W ogóle cała ta sytuacja wydaje m i się dość dziwna bo kod jest poprawny - u mnie działa (jak to mówią rasowi admini).

Pozdrowienia

0

Waldi,
w kodzie bledu nie ma, u mnie tez dziala i to w pierwszej wersji, bez dodatkow. Poszukaj przyczyny bledu u siebie w srodowisku, poeksperymentuj z rozszerzeniem, prawami dostepu do plikow etc etc. Poza tym - na przyszlosc moglbys podac na jakim systemie, ktorej wersji kompilatora i sprzecie to uruchamiasz :)
Czasami na przyklad szukasz bledu a okazuje sie, ze chcesz utworzyc plik o nazwie folderu ktory juz istnieje.. Tego NIKT Ci "zdalnie" nie stwierdzi.

0

Waldi,
w kodzie bledu nie ma, u mnie tez dziala i to w pierwszej wersji, bez dodatkow. Poszukaj przyczyny bledu u siebie w srodowisku, poeksperymentuj z rozszerzeniem, prawami dostepu do plikow etc etc. Poza tym - na przyszlosc moglbys podac na jakim systemie, ktorej wersji kompilatora i sprzecie to uruchamiasz :)

win me d6 PE

Czasami na przyklad szukasz bledu a okazuje sie, ze chcesz utworzyc plik o nazwie folderu ktory juz istnieje.. Tego NIKT Ci "zdalnie" nie stwierdzi.

ale nie ma takiego ani pliku ani folderu nawet jak mu zmienie na c:\plik.dat lub inny to mam to samo

A co się dzieje jeżeli uruchomisz skompilowanego exe-ka (tzn. uruchomisz program spoza Delphi) ? Też wyskakuje błąd ?

Tak poza delphi zahowuje się identycznie

Najlepsze jest to że po kliknięciu ok w okienku błędu i naciśieciu kolejny raz butona który wywołuje tą procedurę normalnie zapisuje do pliku

0
type
 Tfaq =  record
  tytul : string[125];
  tresc : string[125];
 end;
 Tplik = file of Tfaq; 
 var plik : Tplik; 
      faq : Tfaq;

Ja się uczyłem troszkę inaczej tworzyć pliki rekordowe. Może to nie ma większego znaczenia, ale czasem takie kupki okazują się być prawdziwe. Spróbuj tak:

type
 TFaq = record
  tytul: string[125];
  tresc: string[125];
 end;

var
 plik: file of TFaq;
 faq: TFaq;

Różnica jest po prostu w deklaracji zmiennej PLIK. Spróbuj tak, może pójdzie.</quote>

0

Waldi,
moze to wyda Ci sie glupie - ale mialem kiedys WinME i ono bardzo dziwnie traktowalo pliki *.dat, pamietam ze byly jakies numery z usuwaniem, uparcie twierdzily ze dowolny *.dat to plik systemowy i musialem sie lekko pocic. Napisalem: zmien rozszerzenie..

0

Waldi,
moze to wyda Ci sie glupie - ale mialem kiedys WinME i ono bardzo dziwnie traktowalo pliki *.dat, pamietam ze byly jakies numery z usuwaniem, uparcie twierdzily ze dowolny *.dat to plik systemowy i musialem sie lekko pocic. Napisalem: zmien rozszerzenie..

to nie poskutkowało zmieniłem na aat na ini na log na aaa i kilka innych możliwości żadna się nie sprawdziła

Różnica jest po prostu w deklaracji zmiennej PLIK. Spróbuj tak, może pójdzie.

niestety i tym razem nie działa nadal niesmiertelny błąd 183

może ma znaczenie fakt że rekord deklarowany jest w sekcji implementation bo jak to nie ma znaczenia to wezme źródełka jakiegoś gotowego progsa i sobie wywale wszystko oprócz zapisu i odczytu dopliku rekordu zmodyfikowanego przeze mnie.
A może fakt że dane sa pobierane z innej formy która wyświetlana jest za pomoca showmodal???

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