При выводе информации в лог-файл выводится тарабарщина

Страницы: 1
RSS
При выводе информации в лог-файл выводится тарабарщина
 
При выводе информации в лог-файл выводится тарабарщина. То есть информация заменяется на непонятные символы. Очевидно проблема в несовпадении кодировок медку Квиком и лог-файлом, но как ее решить?
 
Для начала выведи сообщение на экран (message). И скорее выведет ту же тарабарщину, а это ошибка расчетов.
 
В том то и дело - выводится все нормально в сообщениях - Quik понимает мою кодировку. При записи в файл информация записывается без изменений, а все остальное превращается в тарабарщину. Вот ссылка на изображение: http://wallmaker.ru/epic/view/qUHG3C6piUZj2WBUaZfitBe2. Как видите, вставил двойки, а все остальное стало фигнёй
 
Это не тарабарщина а символ нулевого кода в тестовой строке.
Попробуйте отключить отображение управляющих символов  в редакторе текста,
на котором смотрите сообщение
или убрать их из выводимой строки.
 
Тогда другой вопрос: кто знает, как отключается это отображение на notepad++
 
Возьмите sciTE
он к тому же написан на луа
и в него модно добавить
различные примочки
и более того в него встроен компилятор
и даже есть с отладчиком луа
----------------------------
И будет Вам счастье  
 
Хорошо бы увидеть либо код, выводящий в файл, либо файл лога выложите где-нибудь, посмотреть что у вас там за кодировка и как вы её добиваетесь
 
код вывода в файл допустим такой:

local file = io.open(ImyaCFGFaila, "w+")
           file:seek("set", 15)
file:write("22")
file:flush()
file:close()

в режиме "w" получается такая же фигня, кодировка скрипта и лог-файла "windows-1251", в "UTF-8" и "ANSI" такая же фигня. Ранее в этом редакторе все работало, когда я писал такие скрипты, том более, что в нем я не только этим занимаюсь, поэтому менять редактор из-за одного непонятного затупа - это все равно, что весь танк списывать из-за того, что у него масляные фильтры засорились
 
Кстати, в режиме "а" дописывает в файл без проблем, он не ломается....
 
вообще-то, так как вы пишите сначала файла, то надо так
local file = io.open(ImyaCFGFaila, "w")
file:write("22")
file:flush()
file:close()
 
можно и так
local file = io.open(ImyaCFGFaila, "w+")
file:write("22")
file:flush()
file:close()
------------------
file:seek("set", 15)  - смещает на 15 байт - вот эти байты вы и видите в редакторе.
 
что касается редактора, то пользуйтесь несколькими.
-----------------------------
Scite - для луа больше , чем  реадктор - это среда разработки.
 
Так я если мне надо заменить старое значение на новое?
 
Еще что заметил. Допустим, вот так:


           local file = io.open(ImyaCFGFaila, "r+")
           file:seek("set", 10)
           file:write("2234")
file:flush()
file:close()
Все работает, и файл не ломается, а переменную писать он не хочет нормально (??????????????)
 
Правда это другой режим и запись со смещением
 
Кстати, количество "NUL" в каждом случае зависит от координат курсора
 
И не в редакторе дело, тоже самое получается в Notepad. Дело похоже в самой Quik и я не удивлен
 
Походу ей не нравятся 32-битные машины
 
Кто что может про разрядность ОСи сказать?
 
Цитата
Deserf пишет:
Кто что может про разрядность ОСи сказать?
При чем тут разрядность ОС?
Вы смещаете курсор на 15 символов в пустоту, вот и получаете эту самую пустоту NUL.
Цитата
Deserf пишет:
Дело похоже в самой Quik и я не удивлен
Это легко проверить, достаточно запустить код без QUIK на том же SiceTW

Чтобы решить проблему используйте режим a+
 
Цитата
Sergey Gorokhov пишет:
SiceTW
опечатка имелось в виду SciTE
 
Цитата
Sergey Gorokhov пишет:
Чтобы решить проблему используйте режим a+

Или допишите в файл что-нибудь прежде чем делать смещение

Код
ImyaCFGFaila="G:\\!!!!\\qwe.log"
local file = io.open(ImyaCFGFaila, "w+")
file:write("111111111111111111111111111111")
file:seek("set", 15)
file:write("22")
file:flush()
file:close()
 
Еще одно наблюдение: необратимые изменения наступают в любом случае, когда файл открывается в режимах "w", даже если в ходе него не происходит ничего: ни записи информации, ни смещения курсора. Так в таком коде получаем из полного лог-файла тупорыло пустой:


           local file = io.open(ImyaCFGFaila, "w+")
file:flush()
file:close()

Скажите, что это за фигня, а то у меня уже башка кружится. Таким образом, ведь дело не в моем кривом коде, и не в ошибочном хранении информации в буфере обмена (и в 32-битности), дело именно в режимах "w" и "w+", режим "а" работает корректно, но мне то надо именно заменять, а не просто приписывать информацию.
 
Можно и не смещать никуда курсор - те же яйца. И смещаю не в пустоту а там, где есть символы, если в пустоту сместить он так то ошибку викидывает сразу
 
Цитата
Deserf пишет:
Можно и не смещать никуда курсор - те же яйца. И смещаю не в пустоту а там, где есть символы, если в пустоту сместить он так то ошибку викидывает сразу
Простите но Вы именно смещаете в пустоту.
Так как режим w+ перезаписывает файл. То есть стирает все и пишет по новой.
 
Lua.org
Цитата
  • "r": read mode (the default);
  • "w": write mode;
  • "a": append mode;
  • "r+": update mode, all previous data is preserved;
  • "w+": update mode, all previous data is erased;
  • "a+": append update mode, previous data is preserved, writing is only allowed at the end of file.
 
Нашел одно решение, не ахти какое: запускаем программу
Цитата
Sergey Gorokhov пишет:
Цитата
Sergey Gorokhov пишет:
Чтобы решить проблему используйте режим a+

Или допишите в файл что-нибудь прежде чем делать смещение
Код
 ImyaCFGFaila="G:\\!!!!\\qwe.log"
local file = io.open(ImyaCFGFaila, "w+")
file:write("111111111111111111111111111111")
file:seek("set", 15)
file:write("22")
file:flush()
file:close()
 
Еще раз пишу: режим "а+" не подойдет: это cfg-файл, мне нужно заменять определенные значения в строго определенном месте, а не дописывать, а потом объяснять при следующем цикле оператором что же им считывать. По скрипту скажу - это тоже не работает
 
Цитата
Sergey Gorokhov пишет:
Цитата
Deserf пишет:
Можно и не смещать никуда курсор - те же яйца. И смещаю не в пустоту а там, где есть символы, если в пустоту сместить он так то ошибку викидывает сразу
Простите но Вы именно смещаете в пустоту.
Так как режим w+ перезаписывает файл. То есть стирает все и пишет по новой.
Прочитайте текст скрипта, который выше - я его ВООБЩЕ НИКУДА НЕ СМЕЩАЛ, а он все равно тупит
 
Цитата
Deserf пишет:
Еще раз пишу:
Еще раз пишу, режим w+ полностью затирает файл при открытии. Таким образом, если Вам нужно изменить уже имеющиеся данные в этом файле, ищите другой способ.
 
Цитата
Deserf пишет:
Прочитайте текст скрипта, который выше - я его ВООБЩЕ НИКУДА НЕ СМЕЩАЛ, а он все равно тупит
Читаю.
Код
local file = io.open(ImyaCFGFaila, "w+")  --Открыли файл и стерли в нем все что есть, так как режим w+
 file:seek("set", 15)  --смефаем курсор на 15 символов в пустоту,, так как файл пустой.
         file:write("22") --пишем строку "22" после 15 пустых символов
         file:flush() --обновляем файл
         file:close() -- закрываем


Еще читаю:
Код
local file = io.open(ImyaCFGFaila, "w+")   --Открыли файл и стерли в нем все что есть, так как режим w+
         file:flush() --обновляем файл
         file:close() -- закрываем


Что не так?
 
Хорошо, вот такой скрипт:


function main()
local ImyaCFGFaila=getScriptPath().."\\" .. "1.txt"
           local file = io.open(ImyaCFGFaila, "w")
file:seek("set", 0)
file:write(tostring("11"))
file:seek("set", 6)
file:write(tostring("....... его рот"))
file:flush()
file:close()
end

Исходная строка в файле "1.txt" такая: "11111111111111111111111111111111111111111111111111111111111­111111" (без всяких переносов и без кавычек)
После работы скрипта: строка в файле "1.txt" такая: "11<NUL><NUL><NUL><NUL>....... его рот", где <NUL> - то самое.
Как видите никакого смещения в пустоту.
 
Цитата
Sergey Gorokhov пишет:
Цитата
Deserf пишет:
Прочитайте текст скрипта, который выше - я его ВООБЩЕ НИКУДА НЕ СМЕЩАЛ, а он все равно тупит
Читаю.
Код
 local file = io.open(ImyaCFGFaila, "w+")  --Открыли файл и стерли в нем все что есть, так как режим w+
 file:seek("set", 15)  --смефаем курсор на 15 символов в пустоту,, так как файл пустой.
         file:write("22") --пишем строку "22" после 15 пустых символов
         file:flush() --обновляем файл
         file:close() -- закрываем 


Еще читаю:
Код
 local file = io.open(ImyaCFGFaila, "w+")   --Открыли файл и стерли в нем все что есть, так как режим w+
         file:flush() --обновляем файл
         file:close() -- закрываем 


Что не так?
Смотрите ниже в режиме "w"
 
Цитата
Deserf пишет:
Цитата
Sergey Gorokhov пишет:
Цитата
Deserf пишет:
Прочитайте текст скрипта, который выше - я его ВООБЩЕ НИКУДА НЕ СМЕЩАЛ, а он все равно тупит
Читаю.
Код
  local file = io.open(ImyaCFGFaila, "w+")  --Открыли файл и стерли в нем все что есть, так как режим w+
 file:seek("set", 15)  --смефаем курсор на 15 символов в пустоту,, так как файл пустой.
         file:write("22") --пишем строку "22" после 15 пустых символов
         file:flush() --обновляем файл
         file:close() -- закрываем  


Еще читаю:
Код
  local file = io.open(ImyaCFGFaila, "w+")   --Открыли файл и стерли в нем все что есть, так как режим w+
         file:flush() --обновляем файл
         file:close() -- закрываем  


Что не так?
Смотрите ниже в режиме "w"
Тут дело не в стирании
 
Цитата
Deserf пишет:
Хорошо, вот такой скрипт:


function main()
local ImyaCFGFaila=getScriptPath().."\" .. "1.txt"
local file = io.open(ImyaCFGFaila, "w")
file:seek("set", 0)
file:write(tostring("11"))
file:seek("set", 6)
file:write(tostring("....... его рот"))
file:flush()
file:close()
end

Исходная строка в файле "1.txt" такая: "11111111111111111111111111111111111111111111111111111111111­111111" (без всяких переносов и без кавычек)
После работы скрипта: строка в файле "1.txt" такая: "11<NUL><NUL><NUL><NUL>....... его рот", где <NUL> - то самое.
Как видите никакого смещения в пустоту.
Режим w тоже стирает файл.
 
Цитата
Deserf пишет:
Тут дело не в стирании
Дело не в стирании файла а в том что Вы смещаете курсор за пределы файла.
 
Цитата
Deserf пишет:
Хорошо, вот такой скрипт:


function main()
local ImyaCFGFaila=getScriptPath().."\" .. "1.txt"
local file = io.open(ImyaCFGFaila, "w")
file:seek("set", 0)
file:write(tostring("11"))
file:seek("set", 6)
file:write(tostring("....... его рот"))
file:flush()
file:close()
end

Исходная строка в файле "1.txt" такая: "11111111111111111111111111111111111111111111111111111111111­111111" (без всяких переносов и без кавычек)
После работы скрипта: строка в файле "1.txt" такая: "11<NUL><NUL><NUL><NUL>....... его рот", где <NUL> - то самое.
Как видите никакого смещения в пустоту.
Вас не удивляет что NUL символов 4 штуки?
Может это потому что Вы смещаете курсор на шесть символов влево, в то время как в строке всего 2 символа?
6-2=4
 
Цитата
Deserf пишет:
Еще раз пишу: режим "а+" не подойдет: это cfg-файл, мне нужно заменять определенные значения в строго определенном месте, а не дописывать, а потом объяснять при следующем цикле оператором что же им считывать.
Вообще-то режим "a+" как раз предназначен, чтобы заменять "определенные значения в строго определенном месте":
Код
local file = io.open(ImyaCFGFaila, "w")
file:write('---------------33---------------')
file:close()

file = io.open(ImyaCFGFaila, "r+") 
file:seek("set", 15) 
file:write("22") 
file:close() 
Надо делать так, как надо. А как не надо - делать не надо.
 
А как же тогда замену информации провернуть, тем более я раньше это делал?
 
Цитата
Старатель пишет:
Цитата
Deserf пишет:
Еще раз пишу: режим "а+" не подойдет: это cfg-файл, мне нужно заменять определенные значения в строго определенном месте, а не дописывать, а потом объяснять при следующем цикле оператором что же им считывать.
Вообще-то режим "a+" как раз предназначен, чтобы заменять "определенные значения в строго определенном месте":
Код
 local file = io.open(ImyaCFGFaila, "w")
file:write('---------------33---------------')
file:close()

file = io.open(ImyaCFGFaila, "r+") 
file:seek("set", 15) 
file:write("22") 
file:close()  
Он дописывает в конце файла
 
Цитата
Deserf пишет:
Он дописывает в конце файла
Вы код запускали? Или вы поспорить пришли сюда?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Deserf пишет:
Цитата
Старатель пишет:
Цитата
Deserf пишет:
Еще раз пишу: режим "а+" не подойдет: это cfg-файл, мне нужно заменять определенные значения в строго определенном месте, а не дописывать, а потом объяснять при следующем цикле оператором что же им считывать.
Вообще-то режим "a+" как раз предназначен, чтобы заменять "определенные значения в строго определенном месте":
Код
  local file = io.open(ImyaCFGFaila, "w")
file:write('---------------33---------------')
file:close()

file = io.open(ImyaCFGFaila, "r+") 
file:seek("set", 15) 
file:write("22") 
file:close()   
Он дописывает в конце файла
А вот "r+" работает - большое человеческое спасибо, жму Вам руку, Вы мне очень помогли, я не шучу
 
Цитата
Deserf пишет:
А вот "r+" работает
Пишу одно, думаю другое... Конечно же "r+"
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель пишет:
Цитата
Deserf пишет:
А вот "r+" работает
Пишу одно, думаю другое... Конечно же "r+"
Еще раз большое спасибо Вам
 
Цитата
Deserf пишет:
А как же тогда замену информации провернуть, тем более я раньше это делал?
Проще это делать так:
-----------------------------
1) создаете таблицу
2) читает в нее все из файла
3) меняете в таблице все, что хотите
4) пишите таблицу в файл (режим "w")
-----------------------------
и будет Вам счастье
Страницы: 1
Читают тему
Наверх