ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Модератор: mike
- vo
- топ-софт
- Сообщения: 63
- Зарегистрирован: Чт, 07/05/2009 13:28
- Имя Фамилия: Викторович Владимир
- Откуда: Галактика
- Контактная информация:
ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Может мой опыт кому-то пригодится... Промучался сегодня полдня прежде чем понял в чем дело.
Обрабатывал txt-файл с помощью функции ReadLn, которая в упор не хотела нарезать файл по строкам. Позднее догадался, что дело в следующем.
Иногда приходится работать с текстовыми файлами, созданными в Unix-среде. Такие текстовые файлы характеризуются тем, что в них в качестве стандартного сочетания окончания строки используется chr(10). При этом текстовые файлы созданные в Windows-среде используют в качестве стандартного окончания строки сочетание символов chr(13)+chr(10). Если текстовый файл, созданный в Unix-среде разбирать функцией ReadLn, то считывание происходит не по строкам, т.к. символ chr(10) не воспринимается как символ окончания строки.
ПРЕДЛАГАЮ:
Доработать Атлантис, чтобы он воспринимал в качестве окончания строки как win-сочетание
chr(13)+chr(10), так и Unix-сочетание - chr(10).
Обрабатывал txt-файл с помощью функции ReadLn, которая в упор не хотела нарезать файл по строкам. Позднее догадался, что дело в следующем.
Иногда приходится работать с текстовыми файлами, созданными в Unix-среде. Такие текстовые файлы характеризуются тем, что в них в качестве стандартного сочетания окончания строки используется chr(10). При этом текстовые файлы созданные в Windows-среде используют в качестве стандартного окончания строки сочетание символов chr(13)+chr(10). Если текстовый файл, созданный в Unix-среде разбирать функцией ReadLn, то считывание происходит не по строкам, т.к. символ chr(10) не воспринимается как символ окончания строки.
ПРЕДЛАГАЮ:
Доработать Атлантис, чтобы он воспринимал в качестве окончания строки как win-сочетание
chr(13)+chr(10), так и Unix-сочетание - chr(10).
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Предлагаю обойтись сторонними средствами.
-
- топ-софт
- Сообщения: 197
- Зарегистрирован: Чт, 06/09/2007 17:38
- Имя Фамилия: Вадим Володько
- Откуда: ТопСофт
- Контактная информация:
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
например, должна спасти вот такая программка на паскале
Код: Выделить всё
var
f1,f2: file of byte;
i: byte;
const
a:byte=13;
begin
assign(f1, paramstr(1));
assign(f2, paramstr(2));
reset(f1);
rewrite(f2);
while not eof(f1) do
begin
read(f1, i);
if i = 10 then
write(f2, a);
write(f2, i);
end;
close(f1);
close(f2);
end.
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Вадим, там же Unix, а к нему много что есть. Например, unix2dos.
-
- топ-софт
- Сообщения: 197
- Зарегистрирован: Чт, 06/09/2007 17:38
- Имя Фамилия: Вадим Володько
- Откуда: ТопСофт
- Контактная информация:
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
он же не из юникса галактику запускает, а всего лишь работает с текстовыми файлами, созданными в юникс-среде.
я так понял из постановки вопроса.
может так случиться, что и юникса-то у него нет, а только файлы такие приходят, например сгенерированные какой-нибудь внешней системой.
действительно, утилит много. но если найти сложно, а есть под рукой паскаль - можно воспользоваться предложенной программкой :)
я так понял из постановки вопроса.
может так случиться, что и юникса-то у него нет, а только файлы такие приходят, например сгенерированные какой-нибудь внешней системой.
действительно, утилит много. но если найти сложно, а есть под рукой паскаль - можно воспользоваться предложенной программкой :)
- vo
- топ-софт
- Сообщения: 63
- Зарегистрирован: Чт, 07/05/2009 13:28
- Имя Фамилия: Викторович Владимир
- Откуда: Галактика
- Контактная информация:
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Действительно так. Утилита должна работать в среде win.vadim писал(а):...может так случиться, что и юникса-то у него нет, а только файлы такие приходят, например сгенерированные какой-нибудь внешней системой...
vadim, благодарю за подсказку!
Т.е. последовательность действий следующая:
скомпилить предложенную программку,
задекларировать ее в Галактике как дополнительную функцию,
и пользовать?
или скомпилить данную программку в exe и вызывать из программого кода Галактики?
Действительно, выход найти можно, но в сущности не совсем понятно, почему же все таки нельзя доработать ReadLn, поскольку доработка, по всей видимости, по трудоемкости вообще никакая...
-
- заказчик
- Сообщения: 46
- Зарегистрирован: Вт, 13/01/2009 10:52
- Имя Фамилия: Сергей Головчак
- Откуда: Гипротрубопровод
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
А зачем такие сложности?
Можно не прибегать к сторонним средствам. Достаточно читать файл посимвольно.
Можно не прибегать к сторонним средствам. Достаточно читать файл посимвольно.
Код: Выделить всё
var c : char;
While not(mFile.eof) Do
{
mFile.Read(c);
If c = chr(10)
........................
}
- vo
- топ-софт
- Сообщения: 63
- Зарегистрирован: Чт, 07/05/2009 13:28
- Имя Фамилия: Викторович Владимир
- Откуда: Галактика
- Контактная информация:
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Во-первых, Read предназначена для работы с бинарными файлами и открывает она их по-другому - т.е. например первый символ из текстового файла не виден, при таком открытии. (Но это только то, что я заметил. Дальше не разбирался).m0p3e писал(а):А зачем такие сложности?
Можно не прибегать к сторонним средствам. Достаточно читать файл посимвольно.Код: Выделить всё
var c : char; While not(mFile.eof) Do { mFile.Read(c); If c = chr(10) ........................ }
Во-вторых, предложенный код - это еще не весь код, который нужно написать, чтобы порезать текст по строкам... Т.е. приходится прикладнику вместо одной строки кода писать 10. В то время как 9 из них уже написаны на уровне атлантиса и нужно только дополнительный if там в одной строчке где-то добавить и проблема будет решена системно! В данной ситуации, считаю, что должно быть системное решение. Это правильнее и вообще не трудозатратно.
-
- заказчик
- Сообщения: 46
- Зарегистрирован: Вт, 13/01/2009 10:52
- Имя Фамилия: Сергей Головчак
- Откуда: Гипротрубопровод
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
А я вроде нигде и не писал, что этот способ снимает необходимость доработки ReadLn. Данный способ был предложен вместо подключения внешних программ/библиотек.
Уже несколько раз читал файлы таким способом и никакие символы никуда не пропадали. Набросать интерфейсик с несколькими Public функциями: Open, EOF и аналога ReadLn под конкретную задачу займет не больше часа.
Уже несколько раз читал файлы таким способом и никакие символы никуда не пропадали. Набросать интерфейсик с несколькими Public функциями: Open, EOF и аналога ReadLn под конкретную задачу займет не больше часа.
- vo
- топ-софт
- Сообщения: 63
- Зарегистрирован: Чт, 07/05/2009 13:28
- Имя Фамилия: Викторович Владимир
- Откуда: Галактика
- Контактная информация:
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Может поделитесь таким интерфейсиком, если имеется?m0p3e писал(а):...Уже несколько раз читал файлы таким способом и никакие символы никуда не пропадали. Набросать интерфейсик с несколькими Public функциями: Open, EOF и аналога ReadLn под конкретную задачу займет не больше часа.
-
- заказчик
- Сообщения: 46
- Зарегистрирован: Вт, 13/01/2009 10:52
- Имя Фамилия: Сергей Головчак
- Откуда: Гипротрубопровод
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Готового нет. Вот набросал. Вроде работает на не-Unix файлах. Теоретически должно работать и на них. Конечно нужно добавить обработку исключений и прочего...
Интересно будет ли пропадать первый символ.
Код: Выделить всё
#ifdef ComponentVersion
#component "C_UNIX"
#end
Interface UnixFile;
File hFile;
Public Function OpenFile ( FileName : string ) : boolean;
{
Result := hFile.OpenFile ( FileName, stOpen );
If Result
hFile.Seek ( 0 );
}; //Function Open
Public Function ReadLn : string;
{
Result := '';
var c : char; c:= '';
var i : Integer; i := 0;
While ( not hFile.Eof and i < 256 and c <> chr ( 10 ) ) Do
{
hFile.Read ( c );
If c <> chr ( 13 )
{
Inc ( i );
If c <> chr ( 10 )
Result += c;
};
};
}; //Function ReadLn
Public Function EOF : boolean;
{
Result := hFile.EOF;
}; //Function EOF
Public Procedure CloseFile;
{
hFile.Close;
}; //Function Close
END.
Interface ReadUnixFile;
var uFile : UnixFile;
HandleEvent
cmInit :
{
var FileName : string; FileName := '';
FileName := GetFileName ( '*.*', 'Выберите файл' );
If FileName <> ''
If uFile.OpenFile ( FileName )
{
While ( not uFile.EOF ) Do
{
LogStrToFile ( 'C:\uFile.log', 'Result=' + uFile.ReadLn );
};
uFile.CloseFile;
};
}; //cmInit
End;
END.
- vo
- топ-софт
- Сообщения: 63
- Зарегистрирован: Чт, 07/05/2009 13:28
- Имя Фамилия: Викторович Владимир
- Откуда: Галактика
- Контактная информация:
Re: ReadLn не работает с переводом каретки в txtфайлах Unix−сред
Спасибо! Проверю-отпишусь.m0p3e писал(а):Интересно будет ли пропадать первый символ.