purebasic.info

PureBasic forum
Текущее время: Ср дек 12, 2018 4:37 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Сб ноя 03, 2018 10:05 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
LinXP писал(а):
Код:
1
Disk$ = LSet(GetHomeDirectory(), 3)

это Windows версия, там у меня работает, хотя уже начал сомневаться. предпоследний пост посмотри для Linux. Я уже думал не вставить ли файл оригинал в секцию Data и записать в файл в оригинальном формате, без кривой кодировки.


У меня новая проблема: хочу добавить в меню открытие ini-файла (обновил на пастбине). Я считал что GetCurrentDirectory() получает путь откуда запущена прога, но как я стал понимать это текущий рабочий каталог, который можно изменить при открытии файла, потому что он у меня открывает "/home/пользователь". Как получить путь к программе?
Код:
1
2
3
4
ElseIf em = 998
        If Prog.s <> ""
                        RunProgram(Prog.s, GetCurrentDirectory() + "SaveFolders.ini", "")
        EndIf



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 10:13 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
GetPathPart(ProgramFilename())


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 10:19 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
LinXP писал(а):
GetPathPart(ProgramFilename())

Спасибо! Я совсем ум за ум зашёл, у меня же путь к ini указан именно таким способом, просто переменную использовать.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 10:25 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
...ты наверное главного не заметил, то как BOM указывать...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 10:38 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
LinXP писал(а):
...ты наверное главного не заметил, то как BOM указывать...

проверил, не помогло, открыл файл в Geany там китайские иероглифы как в одной из тем на форуме (искал по запросу "UTF-8 с BOM site:purebasic.info") и кодировка всё та же UTF16-LE, а мой принудительно созданный файл в Geany показывает UTF-8 (с BOM).

Кстати, было бы странно, если OpenFile и WriteStringFormat с #PB_UTF8 давали бы разные результаты.

Прочитал, значит WriteStringFormat собственно ставит метку BOM. То есть и последующии записи строк автоматически переключают формат вводимых строк в UTF-8? Ну просто я могу к ANSI дописать метку BOM, от этого он не станет UTF-8 или станет но то что там реально написано превратиться в китайские символы.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 10:52 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
значит не как то не так проверяешь.. попробуй на винде свой вариант и с моими правками..

зы: на крайняк костыль:
WriteByte(hfile, $EF)
WriteByte(hfile, $BB)
WriteByte(hfile, $BF)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 11:11 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
LinXP писал(а):
попробуй на винде свой вариант и с моими правками..

в любом случае помог, я сделал так
Код:
1
2
3
4
5
6
7
8
9
hfile = OpenFile(#PB_Any, ini$, #PB_UTF8)
If hfile
        If WriteStringFormat(hfile, #PB_UTF8)
                WriteString(hfile, Text$, #PB_UTF8)
                CloseFile(hfile)
                ProcedureReturn 1
        EndIf
        CloseFile(hfile)
EndIf


то есть и файл указал #PB_UTF8 и метку дописал с помощью WriteStringFormat, теперь работает.


Последний раз редактировалось AZJIO Сб ноя 03, 2018 11:17 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 11:15 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 159
Откуда: Україна
Благодарил (а): 11 раз.
Поблагодарили: 11 раз.
Пункты репутации: 4
вот потесть в линухе:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fileformat = #PB_UTF8 ; попробуй #PB_Ascii, #PB_Unicode
hfile = CreateFile(#PB_Any, "test"+fileformat+".txt")
If hfile
  WriteStringFormat(hfile, fileformat)
  WriteStringN(hfile, "первая строка", fileformat)
  WriteStringN(hfile, "вторая строка", fileformat)
  WriteStringN(hfile, "третья строка", fileformat)
  CloseFile(hfile)
EndIf
 
hfile = ReadFile(#PB_Any, "test"+fileformat+".txt")
format = ReadStringFormat(hfile)
While Eof(hfile) = 0  
   Debug ReadString(hfile, format)
Wend
CloseFile(hfile)



Последний раз редактировалось LinXP Вс ноя 04, 2018 1:02 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 11:20 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
LinXP писал(а):
вот потесть в линухе:

работает, только в параметрах функции CreateFile поправил имя файла

у меня уже работает... я только поправил WriteStringFormat сделал первой, всё таки метку он не пишет после данных, то есть не переписывает файл заново, и поэтому нужно делать запись метки первым.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 3:43 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 339
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
Ну просто я могу к ANSI дописать метку BOM

В Анси ничего не нужно дописывать, а только для других форматах.
Для начала в хексе определить что за формат в тексте,.
Позаписывай в файл типы форматов через перевод строки и узнай с каким совпало тот и приминяй при разводировке.
К слову чтение и запись индификатора формата WriteStringFormat не влияет на кодировку при чтении пуриком текста, там при чтении строки нужно указывать формат. Петр где-то на форуме давал хорош код для этого, чтоб было автоматически :!: .
А вообще можно сюда кинуть текстовой файлик в архиве, тогда будет виднее

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб ноя 03, 2018 7:56 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
balex1978
Цитата:
Петр где-то на форуме давал хорош код для этого, чтоб было автоматически

Подозреваю что про эту процедуру говоришь:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure.s ReadText(File$)
  Protected Text.s = ""
  If ReadFile(0, File$)
    Size = Lof(0)
    If Size>0
      *String = AllocateMemory(Size+10)
      If *String
        FillMemory(*String, Size+10, 0)
        FormatFile=ReadStringFormat(0)
        ReadData(0, *String , Size)
        FillMemory(*String+Size, 8, 0)
        Text.s=PeekS(*String, -1, FormatFile)
        FreeMemory(*String)
      EndIf
    EndIf
    CloseFile(0)
  EndIf
  ProcedureReturn Text
EndProcedure



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс ноя 04, 2018 12:29 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 339
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Чего-то непохоже на нее.
Там сначала читается индификатора ВОМ и уже используя селект/ касе читается в выбранном формате.
Формат по-моему ставится при чтении, сейчас нескажу, пишу с мобилу. Ну на крайняк можно считать в буфер памяти и перегнать пеекС() в переменную и получим в уникоде или Анси в зависимости од настроек компилятора.

Вот кусок из кода выше
If hfile
WriteStringFormat(hfile, fileformat)
WriteStringN(hfile, "первая строка", fileformat)

Его переделать если для чтения так, только я пишу с мобилу и могу неверно написать
fileformat=ReadStringFormat(hfile)
ReadStringN(hfile, fileformat)
По-моему так даже без селект/касе должно работать.

Хотя для записи LinXP дал вроде нормальное. И тот код что показал ты тож вроде должен работать
,правда нет под рукой справки и не пойму зачем там FillMemory, может без этого попробовать если неработает правильно.
Долго искать глянь тут нечто подобное решали viewtopic.php?f=1&t=3945&hilit=ReadStringFormat.

Глянь по-моему нашел viewtopic.php?f=1&t=3751&hilit=ReadStringFormat&start=15#p74559.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс ноя 04, 2018 8:18 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Цитата:
Ну на крайняк можно считать в буфер памяти и перегнать пеекС() в переменную и получим в уникоде или Анси в зависимости од настроек компилятора.

В том и смысл. Другого способа не знаю как преобразовать из одной кодировки в другую кроме как через память.
Цитата:
LinXP дал вроде нормальное.

Согласен.
Цитата:
не пойму зачем там FillMemory

Выделенный фрагмент памяти принудительно забивается нулями. Надо так понимать, что это для перестраховки (что в этом фрагменте точно не будет ничего лишнего, то есть мусора).

Относительно процедуры: сейчас не вспомню откуда взял её (давно было), возможно даже не с этого форума. В противном случае дал бы ссылку на первоисточник.

Добавлено:
WriteStringFormat пишет после данных. Другое дело, что эти три байта должны быть первыми.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 05, 2018 9:23 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 239
Благодарил (а): 22 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
В Windows я захватывал пути из адресной строки текущих окон, чтобы сохранить сессию. А кто знает как это сделать в Linux?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн ноя 05, 2018 9:29 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 339
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
После выделения памяти хоть и записываются нолями это ничего не значит, это твоя забота контролировать адреса записи и типы данных и помни, что и где лежит. А иначе можно и свои данные спутать и получить мусор.

По поводу файла, сначала идёт формат который пишется и читается Read/writeStringFormat с указанием места записи и формата, для блокнота это всегда ноль и при следующем чтении записи этими командами указатель смещается, поэтому нужно учитывать это.

Следующие запись
WriteString(hfile, Text$, #PB_UTF8)
и чтение строк также указывается формат( более точнее напишу когда до компа доберусь).

Если файлик мелкий то можно пользоваться WriteString но большой ReadData выделив память или в масив.
И кинь текстовой файлик в том формате с которым неполучается разобраться, так проще будет, текст любого содержания,даже то что я пишу.

(блин не туда ответ написал)

_________________
искатель истины


Последний раз редактировалось balex1978 Пн ноя 05, 2018 4:20 pm, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB