Форум » [x]Harbour » Беда с функцией AfterATNUM() .... » Ответить

Беда с функцией AfterATNUM() ....

Andrey: Делал обработку текстового файла (в конце строки всегда стоит CHR(13)+CHR(10) ) Не могу получить первую строку функцией AfterATNUM() .... Результирующий файл различается от входящего ! Может как нибудь по другому можно ? Вот примерный текст программы: [more] FUNCTION MAIN() LOCAL nI, nLen, cSource, cTarget := "", cTemp cSource := FILESTR("User5.txt") nLen := NUMAT( CHR(13)+CHR(10), cSource ) ? " Kol-vo CHR(13)+CHR(10) = ",nLen FOR nI := 1 TO nLen ? nI cTemp := AfterATNUM( CHR(13)+CHR(10), cSource, nI ) ? cTemp,"-",LEN(cTemp) // ---- обработка строки ------ // cTemp := MyCRYPT(cTemp) cTarget := cTarget + cTemp + CHR(13)+CHR(10) NEXT STRFILE(cTarget,"User52.txt",.F.) WAIT RETURN NIL [/more]

Ответов - 52, стр: 1 2 3 All

Dima: Можно так сделать и не придумывать велосипед FUNCTION MAIN() LOCAL nI, nLen, cSource, cTarget := "", cTemp /* cSource := FILESTR("User5.txt") nLen := NUMAT( CHR(13)+CHR(10), cSource ) ? " Kol-vo CHR(13)+CHR(10) = ",nLen FOR nI := 1 TO nLen ? nI cTemp := AfterATNUM( CHR(13)+CHR(10), cSource, nI ) ? cTemp,"-",LEN(cTemp) // ---- обработка строки ------ // cTemp := MyCRYPT(cTemp) cTarget := cTarget + cTemp + CHR(13)+CHR(10) NEXT */ if hb_fuse("user5.txt")#-1 do while !hb_feof() Ctarget+=hb_freadln()+CHR(13)+CHR(10) // вот тут можно сразу писать в USER52.TXT , предварительно его открыв в // другом Hb_fselect() hb_fskip() enddo Hb_fuse() STRFILE(cTarget,"User52.txt",.F.) endif RETURN NIL

Dima: PS Для Xharbour - LibMisc.lib Для Harbour - Hbmisc.lib

Vlad04: В Xharbour чтение и разбор текстовых файлов делаю так: cFileNameTxt:="User5.txt" IF FILE(cFileNameTxt) cFileText := TFileRead():New( cFileNameTxt ) cFileText:Open() WHILE cFileText:MoreToRead() cLine:= cFileText:ReadLine() // ваша обработка строки END WHILE //ENDDO cFileText:Close() ENDIF <a href=http://www.es.7searchsoft.com/ >programas gratis</a>


Dima: Andrey пишет: Не могу получить первую строку функцией AfterATNUM() И нужно было использовать BeforATNUM и тогда 1 строка не потеряется и учитывать 4 параметр в этой функции

Andrey: Спасибо БОЛЬШОЕ Vlad04 и Dima !!!

Andrey: Dima пишет: И нужно было использовать BeforATNUM и тогда 1 строка не потеряется и учитывать 4 параметр в этой функции Что-то не получается и с ней !!! Я могу конечно обойтись и как вы предложили и как у меня уже есть сделанные функции, но хотелось бы разобраться с этими НЕПОНЯТНЫМИ функциями. Уж больно исходник маленьким получается, без доп.библиотек ! Вот исправленный текст FUNCTION MAIN() LOCAL nI, nLen, cSource, cTarget := "", cTemp, nSkipChars cSource := FILESTR("User5.txt") ? "Len User5.txt =",LEN(cSource) nLen := NUMAT( CHR(13)+CHR(10), cSource ) ? " Kol-vo CHR(13)+CHR(10) = ",nLen FOR nI := 1 TO nLen ? nI //nSkipChars := ATNUM( CHR(13)+CHR(10), cSource, nI-1 ) //? nSkipChars cTemp := BeforATNUM( CHR(13)+CHR(10), cSource, nI ) ? cTemp,"-",LEN(cTemp) // ------------- обработка строки ---------------- // cTemp := MyCrypt(cTemp) cTarget := cTarget + cTemp + CHR(13)+CHR(10) ? LEN(cTarget) NEXT ? ? "Len User52.txt =",LEN(cTarget) STRFILE(cTarget,"User52.txt",.F.) WAIT RETURN NIL

Pasha: Намного эффективнее будет использование функций TokenInit - TokenNext - TokenEnd: Local cTokenEnv := '' Local cTok := Chr(13) + Chr(10) TokenInit(@c, cTok,, @cTokenEnv) while ! TokenEnd(@cTokenEnv) cLex := TokenNext(c,, @cTokenEnv)) enddo В случае AtNum - BeforeAtNum строка каждый раз в цикле просматривается с самого начала, что крайне неоптимально, а TokenNext "ползет" по строке, выбирая следующую лексему

Andrey: Pasha пишет: TokenInit(@c, cTok,, @cTokenEnv) Да действительно, это оптимальней и лучше для больших файлов !!! Спасибо БОЛЬШОЕ Паша !!! Вот рабочая программа FUNCTION MAIN() LOCAL nI := 1, cSource, cTarget := "" Local cTokenEnv := '', cLex Local cTok := Chr(13) + Chr(10) cSource := FILESTR("User5.txt") ? "Len User5.txt =",LEN(cSource) TokenInit(@cSource, cTok,, @cTokenEnv) DO while ! TokenEnd(@cTokenEnv) cLex := TokenNext(cSource,, @cTokenEnv) ? nI++ ? cLex, LEN(cLex) // ------------- обработка строки ---------------- // cTemp := MyCrypt(cTemp) cTarget := cTarget + cLex + CHR(13)+CHR(10) enddo ? ? "Len User52.txt =",LEN(cTarget) STRFILE(cTarget,"User52.txt",.F.) WAIT RETURN NIL

santy: Пример из хелпа xHarbour функции TokenInit() // This example does the same, but takes advantage of local tokenizer // environments. The performance is about 20% better compared to the // global tokenizer environment, since SaveToken() and RestToken() are // not needed. #define CRLF Chr(13)+Chr(10) PROCEDURE Main LOCAL cText := MemoRead( "Textfile.txt" ) LOCAL cToken, cTokenEnv LOCAL aLines := {} LOCAL nLines := 0 LOCAL nWords := 0 // initialize local tokenizer environment TokenInit( @cText, CRLF, 2, @cTokenEnv ) DO WHILE .NOT. TokenEnd( @cTokenEnv ) cToken := TokenNext( @cText, , @cTokenEnv ) IF cToken == "" // one blank space is an empty line for AChoice() cToken := " " ENDIF nLines ++ nWords += WordCount( @cToken ) AAdd( aLines, cToken ) ENDDO // display the text file AChoice( ,,,, aLines ) CLS ? "Line count:", nLines ? "Word count:", nWords RETURN FUNCTION WordCount( cText ) LOCAL cTokenEnv LOCAL nWords := 0 TokenInit( @cText, " ,.!?", @cTokenEnv ) DO WHILE .NOT. TokenEnd( @cTokenEnv ) TokenNext( @cText, , @cTokenEnv ) nWords ++ ENDDO RETURN nWords

Dima: Andrey У тебя вроде ж должен быть xHarbour Language Reference Guide , посеял что ли ? :)

Andrey: Dima пишет: У тебя вроде ж должен быть xHarbour Language Reference Guide Да есть он у меня, просто ночью делал и начал как в клипере с NUMAT() и на нем зациклился. А с TOKEN() у меня всегда непонятка была. Не люблю я его. Спасибо Паша направил на путь истинный... А уж после него и сам в Хелпе обнаружил...

Andrey: Теперь другая фигня ! Хочу в лог-файл добавлять данные, но чтоб пользователь не мог видеть и править их. Беру файл, построчно шифрую и записываю в другой. Потом проверяю: считываю шифрованный файл, построчно разбираю, дешифрую строку и записываю в другой файл. Не работает ! Остаются куски шифрованные ! Вот текст программы: FUNCTION MAIN() Local nI := 1, cSource, cTarget := "" Local cTokenEnv := '', cLex, cLex2 Local cTok := Chr(13) + Chr(10) Local cFileIsx := "User5.txt", cFileCrypt := "User5crypt.txt" Local cFileDeCrypt := "User5DeCrypt.txt", cPassWord := "testfile" CLEAR SCREEN ? ? cSource := FILESTR(cFileIsx) ? "Len "+cFileIsx+" =",LEN(cSource)," bytes" TokenInit(@cSource, cTok,, @cTokenEnv) DO while ! TokenEnd(@cTokenEnv) cLex := TokenNext(cSource,, @cTokenEnv) ? "Stroka:",nI++ //? cLex, LEN(cLex) // ------------- обработка строки ---------------- cLex := HB_Crypt( cLex, cPassWord ) cTarget := cTarget + cLex + cTok enddo ? ? "Len "+cFileCrypt+" =",LEN(cTarget)," bytes" STRFILE(cTarget,cFileCrypt,.F.) ? ? ? "DeCrypt file: "+cFileCrypt cSource := FILESTR(cFileCrypt) ? "Len "+cFileCrypt+" =",LEN(cSource)," bytes" cTarget := "" nI := 1 cTokenEnv := '' TokenInit(@cSource, cTok,, @cTokenEnv) DO while ! TokenEnd(@cTokenEnv) cLex := TokenNext(cSource,, @cTokenEnv) ? "Stroka:",nI++ // ------------- обработка строки ---------------- cLex2 := HB_DeCrypt( cLex, cPassWord ) // ? cLex2, LEN(cLex2) cTarget := cTarget + cLex2 + cTok enddo ? ? "Len "+cFileDeCrypt+" =",LEN(cTarget)," bytes" STRFILE(cTarget,cFileDeCrypt,.F.) ? WAIT RETURN NIL Кто поможет ? Может не надо использовать Chr(13) + Chr(10), а делать свои метки ?

Dima: Проверил на простом USER5.TXT Cодержимое 111 222 333 444 После отработки программы содержимое файла User5DeCrypt.txt == User5.txt PS В User5crypt.txt все chr(13)+chr(10) на своих местах

Andrey: Dima пишет: Проверил на простом USER5.TXT Это мало. Сделай из DBF-файла (записей 6) CVS-файл, с разделителем "," ! Можно через DBU.EXE

Dima: Сделал , все в норме. Дай свой текст USER5.TXT PS Глянь свой User5.txt в 16-ричном виде (можно через Far) , может у тебя где то chr(13) потерялся в конце какой то строки

Andrey: Dima пишет: Дай свой текст USER5.TXT Даю. Заодно и программу на хХарборе 1.0.0 http://files.mail.ru/IMUKCV

Dima: Andrey LOL Забей в файлике User5.txt всего одну строчечку и сделай после нее перевод строки , прогу запусти и глянь результат в User5DeCrypt.txt Строка такая w:\fond9\abonent4.exe"," или вот так ;) w:\fond9"," или так w:\fond9" ЗЫ Harbour 2.0.0 так же сработал (я о результате в User5DeCrypt.txt)

Andrey: Блин, фигня получается.... Файл считывается правильно, а дальше не работает: TokenInit(@cSource, cTok,, @cTokenEnv) DO while ! TokenEnd(@cTokenEnv) cLex := TokenNext(cSource,, @cTokenEnv) ? "Stroka:",nI++ ?? ":",cLex // ------------- обработка строки ---------------- cLex2 := HB_DeCrypt( cLex, cPassWord ) // ? cLex2, LEN(cLex2) cTarget := cTarget + cLex2 + cTok enddo Т.е. TokenNext(cSource,, @cTokenEnv) выдает неправильную строку !!! А что делать то ? Как исправить данную ситуацию ? Может не надо использовать Chr(13) + Chr(10), а делать свои метки ?

Dima: Crypt , Decrypt по таким строкам работает верно (проверил) Возможно где то косяк в твоей функции (я особо не вникал) Хотя довольно странно Так не работает w:\fond9" А так работает :\fond9" В обоих случаях в конце строки есть перевод строки.

Dima: Andrey пишет: А с TOKEN() у меня всегда непонятка была. Не люблю я его. Пробни то что то Vlad04 предложил или я.



полная версия страницы