dani17 napisał(a)
CloseFile mam w kodzie. Tak banalnego błędu bym nie popełnił. Przez przypadek tylko nie skopiowałem tej linijki.
Moje niedopatrzenie - przywykłem do kodu, w którym poszczególne jego logiczne "sekcje" oddzielone są pustymi liniami, stąd czasem nie zauważam niektórych instrukcji; Co i tak nie zmienia faktu, że bezpieczniejszą konstrukcją jest poniższa:
var
tfInput: TextFile;
begin
AssignFile(tfInput, 'info.txt');
{$IOCHECKS OFF}
Reset(tfInput);
{$IOCHECKS ON}
if IOResult() = 0 then
try
{ ładowanie zawartości pliku do pamięci }
finally
CloseFile(tfInput);
end;
end;
Po pierwsze ukrywasz domyślną obsługę błędów wejścia/wyjścia, a po drugie zapewniasz zamknięcie pliku, które w przypadku zaistnienia wyjątku podczas ładowania zawartości pliku może zostać pominięte;
Tu jest problem tylko z pierwszą linijką.
W takim razie na pewno plik posiada sygnaturę BOM; Podobny "problem" miałem przy przystosowywaniu kodu mojej biblioteki do TreeStructInfo, bo parser walił wyjątkiem i nie pokapowałem się dlaczego; W każdym razie @kAzek pokazał Ci jak się tej sygnatury pozbyć;
Zainteresuj się jakimś sensownym edytorem (polecam Notepad++), w którym łatwo wykryjesz stronę kodową zawartości pliku, a po drugie łatwo będziesz ją mógł zmienić (opcje Convert to XXX
);
A jakie mógłbym mieć później problemy? Dużo to zmienia?
W zależności od użytych dyrektyw kompilatora, typ String może być tożsamy z typem ShortString, AnsiString lub UnicodeString; Więcej na ten temat możesz wyczytać tutaj;
Wydaje mi się, że nie mógłbym tego użyć, w taki sposób, aby potrzebne było mniej kodu.
Możesz, np. tak:
var
slInput: TStringList;
begin
slInput := TStringList.Create();
try
slInput.LoadFromFile('info.txt');
{ obróbka danych }
finally
slInput.Free();
end;
end;
Ładowaniem zajmują się wewnętrzne mechanizmy listy; Dodatkowo, klasa służy także jako kontener na dane, więc masz dwie rzeczy w jednym; Sam ręcznie nie musisz wszystkiego robić - klasa zrobi to za Ciebie, a dodatkowo oferuje wiele przydatnych metod, np. wspomniane wcześniej IndexOf
;
Gdy program znajdzie linijkę [start]
to uruchamiana jest procedura, która w zakresie od [start]
do następnego [start]
wyszukuje odpowiednich parametrów i przypisuje do tablicy zdefiniowanego przeze mnie typu. Przy czym może się zdarzyć, że pierwsza "sekcja" będzie miała 10 atrybutów, a następna tylko np. 2.
Składnia pokazanego przez Ciebie pliku zawiera się w specyfice składni plików INI
, więc może zainteresuj się klasą do obsługi plików tego formatu - TIniFile.