1 | ||||||
Чтение текстового файла из TFileStream27.06.2013, 17:34. Показов 24072. Ответов 53
Метки нет (Все метки)
Добрый день. Читаю текстовый файл TFileStream (т.к. файл открыт для записи другой программой и просто по-паскалевски его открыть нельзя), но читается не правильно . Подскажите что я делаю не так. Код:
0
|
27.06.2013, 17:34 | |
Ответы с готовыми решениями:
53
TFileStream чтение файла 200+ мб и кракозябры TfileStream чтение данных Чтение из текстового файла Чтение из текстового файла |
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
27.06.2013, 18:04 | 4 |
Не мучайся, вот готовый класс TTextFileStream:
Код
unit TextFileStream; interface uses Classes; type TTextFileStream = class(TFileStream) public function Eof: Boolean; function ReadLn: string; procedure WriteString(const s: string); procedure WriteLn(const s: string); overload; procedure WriteLn; overload; end; const LineEnd = #13#10; implementation function TTextFileStream.Eof: Boolean; begin result := (Position >= Size); end; function TTextFileStream.ReadLn: string; const BlkSize = 128; var c: char; i: Integer; begin SetLength(Result, BlkSize); i := 0; while not Eof do begin Read(c, SizeOf(c)); if c = #13 then begin Read(c, SizeOf(c)); if c <> #10 then begin Seek(SizeOf(c), soFromCurrent); end; break; end; if c = #10 then begin break; end; Inc(i); if i > BlkSize then SetLength(Result, Length(Result) + BlkSize); Result[i] := c; end; SetLength(Result, i); end; procedure TTextFileStream.WriteString(const s: string); var i: integer; begin for i := 1 to Length(s) do begin Write(s[i], SizeOf(s[i])); end; end; procedure TTextFileStream.WriteLn; begin Write(LineEnd, Length(LineEnd)); end; procedure TTextFileStream.WriteLn(const s: string); begin WriteString(s); WriteLn; end; end.
0
|
Заблокирован
|
||||||
27.06.2013, 18:10 | 5 | |||||
Добавлено через 1 минуту @mss, у тебя не лучше будет из-за char двухбайтового на 2009.
1
|
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
27.06.2013, 18:14 | 7 |
С чего бы вдруг ?
SizeOf() для чего в коде фигурирует, как думаешь ? А, ну если имеется ввиду что читаемый файл заведомо не юникодовый, то подправить же недолго - просто заменить String на AnsiString и Char на AnsiChar... И до кучи имя класса неплохо при этом бы еще подрихтовать - TTextFileStream на TAnsiTextFileStream.
0
|
28.06.2013, 22:45 [ТС] | 9 |
2 Dr. Quake.
Спасибо, Ваш пример работает, но очень медленно, профайлер показывает, что из-за условия останова, а точнее, из-за вызова FText.Position. Нет ли варианта пооптимальнее? Спасибо.
0
|
angstrom
|
||||||
28.06.2013, 23:00 | 10 | |||||
|
angstrom
|
|
28.06.2013, 23:14 | 12 |
И что это даст? Что-то я не вижу в приведённом выше коде никакой обработки кроме заполнения TMemo. Тут TMemo заполняется за один проход без лишних телодвижений.
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|||||||||||
28.06.2013, 23:45 | 13 | ||||||||||
Если содержимое файла надо загрузить в экземпляр потомка от TStrings - в TMemo.Lines, например, то можно сразу грузить из потока с помощью метода LoadFromStream():
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
29.06.2013, 21:45 | 15 | |||||
LoadFromFile() здесь не подойдёт из-за вот этого:
LoadFromFile() определён так:
0
|
3584 / 2194 / 692
Регистрация: 29.05.2013
Сообщений: 9,365
|
|
29.06.2013, 21:49 | 16 |
А переопределить событие TStrings.LoadFromFile не судьба?
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
29.06.2013, 23:08 | 17 |
Нет смысла такое затевать. Загрузка из потока - всего несколько строк кода.
Добавлено через 1 час 10 минут Вернее, дело не в количестве строк кода, а в том, что здесь нет смысла менять архитектуру компонентов.
0
|
angstrom
|
|
29.06.2013, 23:59 | 19 |
Это называется из пушки по воробьям. Ради одиночной загрузки из файла писать "наследника".
|
Заблокирован
|
|
30.06.2013, 18:22 | 20 |
Но кода мало. Две процедуры всего переписать и два класса наследника(объявление одна строка) тупо копипастнув и поменяе две буквы буквально в остальном.
0
|
30.06.2013, 18:22 | |
30.06.2013, 18:22 | |
Помогаю со студенческими работами здесь
20
Чтение с текстового файла Чтение текстового файла Чтение текстового файла Работа с классом TFileStream. Запись; Чтение; Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |