Nie wiem jak jest w pascalowcach, ale w C/ C++/ Javie nigdzie nie trzeba wywoływać flush() jeśli nie ma takiej potrzeby. Tzn flush() jest po to, żeby natychmiast zrzucić zawartość bufora na dysk i zwrócić sterowanie dopiero po potwierdzeniu zapisu. Jeśli zapisujemy do pliku, obojętnie czy buforowanego czy nie, nie dostaniemy żadnego przepełnienia bufora z d**y, bo biblioteka standardowa sama sobie będzie zrzucać dane na dysk z bufora (o ile taki bufor będzie). O ile nie będziemy robić flush() za każdym razem to zapis może się odbywać z pewnym, nieznanym dla nas, opóźnieniem, przez co np mimo iż nasz program wrzucił wszystkie dane do procedury zapisującej to przy brutalnym przerwaniu programu (np kill -9) może się zdarzyć, że nie wszystkie dane zostaną zapisane. Zamykanie strumienia/ pliku/ etc do zapisu chyba zawsze robi w środku flush.
w Pascalu jest podobnie, bufor jest sprawdzany przy procedurze plikowej (tj. zapis danych etc.). Zresztą, wydaje mi się że bufor raczej istnieje w samym win32, nie w RTL.
Flusha używam tylko gdy wymagam żeby dane trafiły do pliku zanim przejdę dalej (np. gdy loguję coś a następne procedury potencjalnie wywalą program). NIE ZDARZY SIĘ tak że dane 'znikają' w buforze, tylko Furious ma jakieś zwidy... No chyba że mi pokaże demko które zaprezentuje to. Czekam...
Var S: Pointer;
Begin
GetMem(S, 1024);
Readln(String(S));
Writeln(String(S));
Readln;
End.
Nadal wykonujesz na Stringu i musiałeś jawnie rzutować. Wiem że można kombinować, ale i tak wychodzi na string, który symulujesz innymi rzeczami...
Ad.3 - (taka forma ciekawostki :P) kiedyś można było robić Readln(PChar), lecz zostało to wyłączone dla uniknięcia buffer overflow
2005... To zanim zacząłem używać FPC, więc można powiedzieć że archeologia której nikt nie pamięta (zakładając że jestem tutaj osobą która najdłużej używa FPC). Ciekawostka nieaktualna :P .
Dokładne, CloseFile()
Albo Close
... CloseFile to tylko wrapper, o czym wiele osób zapomina...
-123oho dziękuję za trafną odpowiedź. Tak myślałem że to będzie jakaś głupota... wychodzą efekty tygodnia pracy, na szczęście już piątek
Takie podstawowe błędy raczej powinieneś wykryć. Słabe wytłumaczenie... Zwłaszcza że obcięte pliki to typowy objaw, no ale powiedzmy że zdarzyło ci się to pierwszy raz.
po pierwsze: koledze powyżej tyle danych wystarczyło by zlokalizować błąd
To NIE ZNACZY że masz podawać mniej niż więcej. Podawaj więcej danych, bo nie lubię grać w 100 pytań do pytacza. To że tutaj miałeś farta nie znaczy że tak będzie zawsze.
Who cares, skoro jest ona niepoprawna?
Jak będziesz łatał bugi, to będziesz robił miliardy if'ów zamiast znaleźć źródło błędu?
Akurat try finally jest niepotrzebne jeżeli o to chodzi. Sam często tego nie stosuje bo po prostu procedura nie jest Exception aware i nie widzę sensu utrudniać rzeczy na siłę. I tak większość wyjątków kieruję bezpośrednio do aplication-wide handlera który wywala aplikację... Nie ma sensu przejmować się wyciekiem pamięci w takim wypadku...
Co do łatania bugów, to przecież gdy każda druga operacja czytania z plików crashuje, to lepiej zamykać i otwierać plik, rozwiązanie typowo z 4programmers. No ale ja nie wiem jak prawdziwi programiści łatają bugi ;) .
To rozwiązanie może być co najwyżej póki co dobre...
No tak, bo trzeba zakładać że exceptiony będą lecieć ze wsząd... Jeżeli aplikacja ma działać po wyjątku to tak, trzeba o tym pamiętać, ale jeżeli nie to nie widzę sensu się tym przejmować.