Перейти к содержимому


Фотография

Функция перезаписи файла!


Лучший Ответ Totoro , 07 Октябрь 2017 - 17:12

А, понятно.

Ну в таком случае тебе просто надо перезаписывать файл. Открывай его с режимом r, обрабатывай данные, закрывай и переоткрывай в режиме w. Файл перезапишется начистую.

Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 Оффлайн   Stinger

Stinger
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 07 Октябрь 2017 - 16:36

Здравствуйте друзья, проблема в следующем lua обращается к файлу и нужно что бы в следующий раз он получил значение из файла - добавил к нему новое и перезаписал, но lua просто дописывает значение в файл, просьба помочь.



#2 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 683
  • Уровень сигнала: 0,36%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 07 Октябрь 2017 - 17:00

В обычном Луа можно было бы использовать режим a+ - "чтение плюс дозапись".

 

Например так:

-- открываем файлик в режиме чтения-добавления
-- если файлика не существовало в момент открытия - он будет создан
-- если он существовал - будет открыт на дозапись
local file = io.open("hotto-dogu.txt", "a+")

file:write("i like hotto dogu\neat eat eat hotto dogu\n")

-- закрываем файлик
-- (это правило хорошего тона, как минимум)
file:close()

Запускаем два раза, и в файле hotto-dogu.txt появляется четыре строки:

i like hotto dogu
eat eat eat hotto dogu
i like hotto dogu
eat eat eat hotto dogu

Однако в OpenComputers всё чуть сложнее, потому что режимы с плюсиками не работают. OpenComputers поддерживает только режимы r, w и a.

То есть нам придётся сначала открыть файл на чтение, прочесть что надо, закрыть, а потом уже открывать на дозапись.

Например так:

local comboCounter = 0

-- открываем на чтение и вершим свои тёмные дела
local file = io.open("hotto-dogu.txt", "r")

if file ~= null then
  for line in file:lines() do comboCounter = comboCounter + 1 end
  file:close()
end

-- а теперь открываем на дозапись, и дозаписываем какую-нибуь хренотень
file = io.open("hotto-dogu.txt", "a")

if comboCounter == 0 then
	file:write("hotto dogu\n")
else
  file:write("hotto dogu [x" .. comboCounter + 1 .. "]\n")
end

file:close()

Запустим программу раз пять, и вуаля!

hotto dogu
hotto dogu [x2]
hotto dogu [x3]
hotto dogu [x4]
hotto dogu [x5]

  • eu_tomat и Stinger это нравится

#3 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 07 Октябрь 2017 - 17:06

Спасибо за ответ, не совсем то , что надо, нужно следующее :

 

Изначально в файле значение 5! -- только 5 ничего более

Программа открывает файл - получает его значение в данном случае 5,

Потом плюсует к этому значению допустим 4 и перезаписывает файл.

И при следующем открытии должно выдать уже не 5 а 9!

 

Не построчно!



#4 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 683
  • Уровень сигнала: 0,36%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 07 Октябрь 2017 - 17:12   Лучший Ответ

А, понятно.

Ну в таком случае тебе просто надо перезаписывать файл. Открывай его с режимом r, обрабатывай данные, закрывай и переоткрывай в режиме w. Файл перезапишется начистую.



#5 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 07 Октябрь 2017 - 17:14

А, понятно.

Ну в таком случае тебе просто надо перезаписывать файл. Открывай его с режимом r, обрабатывай данные, закрывай и переоткрывай в режиме w. Файл перезапишется начистую.

Большое спасибо ещё один вопрос не по теме, мне нужно сделать, что бы значения больше 1000 разбивались запятыми допусти 1510 стало 1,510 и тд , думаю понятно, как это можно сделать средствами lua ?



#6 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 683
  • Уровень сигнала: 0,36%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 07 Октябрь 2017 - 17:18

...мне нужно сделать, что бы значения больше 1000 разбивались запятыми допусти 1510 стало 1,510 и тд , думаю понятно, как это можно сделать средствами lua ?...

 

Вот тут например предлагают вот такую симпатичную функцию юзать для этих целей:

function comma_value(n) -- credit http://richard.warburton.it
	local left,num,right = string.match(n,'^([^%d]*%d)(%d*)(.-)$')
	return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right
end

Юзается так:

print(comma_value(9))
print(comma_value(999))
print(comma_value(1000))
print(comma_value('1333444.10'))
print(comma_value('US$1333400'))
print(comma_value('-$22333444.56'))
print(comma_value('($22333444.56)'))
print(comma_value('NEG $22333444.563'))

Выведет это:

9
999
1,000
1,333,444.10
US$1,333,400
-$22,333,444.56
($22,333,444.56)
NEG $22,333,444.563

Для записи в файл просто замени print на file:write.


  • Stinger это нравится

#7 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 07 Октябрь 2017 - 17:19

...

Спасибо от души, эта функция нужна именно на выходе.


Сообщение отредактировал Totoro: 07 Октябрь 2017 - 17:20
цитатки сокращаем ;)


#8 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 07 Октябрь 2017 - 17:22

attempt to call field `match' (a nil value) вот такая проблема с этой функцией)

 

 

Исправил, мой косяк, спасибо огромное за помощь Totoro


Сообщение отредактировал Stinger: 07 Октябрь 2017 - 17:26


#9 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 683
  • Уровень сигнала: 0,36%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 07 Октябрь 2017 - 17:26

attempt to call field `match' (a nil value) вот такая проблема с этой функцией)

 

Не проверял этот код именно в OpenComputers. Но проблем вроде не должно быть. Может ты опечатался где-то?

Скинь скрин этого кода из игры, и скрин ошибки отдельно.

Я сейчас попробую тоже проверить.



#10 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 07 Октябрь 2017 - 17:27

Всё работает, после того как взял целую функцию с того сайта.
 
Вот эту:

 

Спойлер

 

Видимо это связанно как то с тем, что я использую lua 5.0, кстати есть ли возможность его обновить если он вшит в консоль игры ? 


Сообщение отредактировал Stinger: 07 Октябрь 2017 - 17:29


#11 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 07 Октябрь 2017 - 17:33

Если вас интересуют исходники LuaSQL модуля на C++ могу выложить, делалось под игру, работает с MSSQL SERVER любой версии.


Сообщение отредактировал Stinger: 07 Октябрь 2017 - 17:33





Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика