Работа с файлами. Основы

Pixilang по русски
Post Reply
User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Работа с файлами. Основы

Post by NightRadio » Sun May 04, 2008 9:31 am

Не все знакомы со стандартными Си-шными командами типа fopen, fclose для работы с файлами. Но именно такие команды включены в Pixilang, поэтому попытаюсь вкратце описать основы.

Основной подход такой:
ОТКРЫВАЕМ ФАЙЛ ДЛЯ ЗАПИСИ ИЛИ ДЛЯ ЧТЕНИЯ
ЗАПИСЫВАЕМ ИЛИ ЧИТАЕМ
ЗАКРЫВАЕМ ФАЙЛ

Пример открытия и закрытия файла для записи:
f = fopen( "ИМЯ ФАЙЛА", "wb" )
fclose( f )

Пример открытия и закрытия файла для чтения:
f = fopen( "ИМЯ ФАЙЛА", "rb" )
fclose( f )

В обоих примерах указатель на открытый файл помещается в переменную f.

Непосредственно команды чтения и записи такие:
fgetc( f ) - получить следующий байт из открытого файла f
fputc( ЗНАЧЕНИЕ, f ) - записать в открытый файл f байт со значением ЗНАЧЕНИЕ.
feof( f ) - возвращает 1, если достигнут конец файла. В противном случае возвращает 0
fseek( f, СМЕЩЕНИЕ, РЕЖИМ ) - перемотка файла на нужную позицию (СМЕЩЕНИЕ). Режимы: 0 - смещение задано относительно начала файла; 1 - смещение задано относительно текущего положения в файле; 2 - смещение задано относительно конца файла.
ftell( f ) - возвращает текущую позицию в файле.

Вот пример записи двух байт в файл:
f = fopen( "FILE.TXT", "wb" )
fputc( 33, f )
fputc( 44, f )
fclose( f )

Пример чтения двух байт из файла:
f = fopen( "FILE.TXT", "rb" )
byte1 = fgetc( f )
byte2 = fgetc( f )
fclose( f )

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Работа с файлами. Основы

Post by Al_Rado » Thu May 15, 2008 11:10 pm

Продолжу тему, но о команде file_dialog...
В простейшем примере с загрузкой картинки все работает:

filename = " "
file_dialog( filename, "Загрузка Gif", "gif", "test_dialog_id" )
my_gif=load_pixi(filename)
pixi(my_gif)
frame()

А вот с выгрузкой у меня возникли сложности:

filename = " "
file_dialog( filename, "Сохранение Gif", "gif", "gfx_files_dialog" )
video_export_gif( "$filename.gif", -160, -120, 320, 240)
...

Проблема в том, что прога сохраняет файл с именем 6.gif
Не могу понять, что с переменной filename не так :(
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Работа с файлами. Основы

Post by NightRadio » Fri May 16, 2008 6:35 am

Просто запись $a в принте говорит о том, что нужно вывести числовое значение переменной a :) Я уже думал о том, что нужно и текстовые как-то выводить, но пока ничего удобного в голову не пришло.

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Работа с файлами. Основы

Post by Al_Rado » Fri May 16, 2008 11:00 am

Ну чтож, тогда можно использовать file_dialog для выбора места записи файла, а записывать файл с цифрами (часами, минутами, секундами)
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Работа с файлами. Основы

Post by NightRadio » Fri May 16, 2008 3:26 pm

А почему с выгрузкой нельзя так же, как и с загрузкой? :)

file_dialog( filename, "Сохранение Gif", "gif", "gfx_files_dialog" )
video_export_gif( filename, -160, -120, 320, 240 )

Дело в том, что команда файлового диалога сама подставляет расширение, если вы после ввода имени файла нажали Enter. В новой версии я постараюсь не забыть сделать, чтобы расширение подставлялось и просто при нажатии на OK.
Можно еще к переменной filename обратиться, как к массиву - найти символ окончания строки (ноль) и добавить три символа 'G', 'I', 'F'

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Работа с файлами. Основы

Post by Al_Rado » Fri May 16, 2008 4:15 pm

В таком варианте Пикси вообще ничего не записывает... Картинку в смысле, временные файлы то пишет.
Пример на граф. редакторе Goglusa:

COLOR = RED
ANIM_CLEAR = SNEG //Цвет заднего плана
FRAME=0
PLAY = 0
ANIM_PIXI = new_pixi( 32, 32, 8 )
set_screen(0)
ANIM_ZOOM=4
start:
clear(ANIM_CLEAR)
if PLAY { fpixi(ANIM_PIXI,0,0,ANIM_ZOOM,0,get_timer(0)/48) } else { fpixi(ANIM_PIXI,0,0,ANIM_ZOOM,0,FRAME) }
handle_keys({PLAY = 0 drave framebottom },{drave},{drave})
box( -50, -50, 100, 100, BLACK )
fbox(-70,-50,10,10,RED) print(">",-70,-50,WHITE)
fbox(-90,-50,10,10,RED) print("<",-90,-50,WHITE)
fbox(-90,-30,35,10,RED) print("play",-90,-30,WHITE)
fbox(-90,-10,35,10,RED) print("save",-90,-10,WHITE)
frame()
if save_animation { //Выполнение запроса на сохранение анимации
save_animation = 0
ANIM_SAVE
}
go start

drave:
set_screen(ANIM_PIXI,FRAME)
if gpr(-50,-50,100,100){ dot( get_pen_x/ANIM_ZOOM, get_pen_y/ANIM_ZOOM, COLOR ) }
set_screen( 0 )
ret

framebottom:
if gpr(-70,-50,10,10) {FRAME+1}
if gpr(-90,-50,10,10) {FRAME-1}
if gpr(-90,-30,30,10) {PLAY=1 start_timer(0)}
if gpr(-90,-10,35,10) {save_animation = 1} //Установка запроса на сохранение анимации
ret

//ПОДПРОГРАММА СОХРАНЕНИЯ ВСЕГО МУЛЬТА В ФАЙЛ:
ANIM_SAVE:
h = get_hours
m = get_minutes
s = get_seconds
xs = get_pixi_xsize( ANIM_PIXI )
ys = get_pixi_ysize( ANIM_PIXI )



filename = " "
file_dialog( filename, "Сохранение Gif", "gif", "gfx_files_dialog" )
video_export_gif( filename, -((xs*ANIM_ZOOM)/2), -((ys*ANIM_ZOOM)/2), xs*ANIM_ZOOM, ys*ANIM_ZOOM)



//video_export_gif( "pic_$h.$m.$s.gif", -((xs*ANIM_ZOOM)/2), -((ys*ANIM_ZOOM)/2), xs*ANIM_ZOOM, ys*ANIM_ZOOM )
f = 0 while( f < get_pixi_frames(ANIM_PIXI) ) {
clear( ANIM_CLEAR )
fpixi( ANIM_PIXI,0,0,ANIM_ZOOM,0,f )
frame( 100 )
f + 1
}
stop_video_export
ret
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Работа с файлами. Основы

Post by NightRadio » Fri May 16, 2008 11:02 pm

гм... должен
а вот строчка filename = " " именно так и пишется? Если да, то это неправильно. Внутри ковычек должна быть куча пробелов, чтобы хватило место для имени файла :) Дело в том, что команда file_dialog() не выделяет место самостоятельно, а просто пытается сохранить имя файла в уже существующую строку. Если символов в существующей строке не хватает, то имя файла обрезается.

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Работа с файлами. Основы

Post by Al_Rado » Sat May 17, 2008 3:28 pm

Да, filename там с кучей пробелов как и надо... эт движок форума их упростил :) Согласен, должно работать, а вот не работает... Такая вот загадка )
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Работа с файлами. Основы

Post by NightRadio » Mon May 19, 2008 7:40 am

странно :) Проверю, в чем тут дело.

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Работа с файлами. Основы

Post by NightRadio » Tue May 20, 2008 7:08 am

Проверил - у меня приведенный пример работает без проблем :) Наставил кучу пробелов, которые удалил форум, и все ок. Тестировалось на пререлизе 1.6?

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Работа с файлами. Основы

Post by Al_Rado » Tue May 20, 2008 11:25 am

Да, все верно, в версии Pixilang 1.6 все работает
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
vtl
Posts: 31
Joined: Sun Dec 28, 2008 6:41 pm
Location: Saint Petersburg, Russia
Contact:

Re: Работа с файлами. Основы

Post by vtl » Tue Dec 30, 2008 11:40 am

у меня вот тоже проблемка. вот пытаюсь открыть или создать файл:

bla:
str = new_string(512)
if (file_dialog(str, "Загрузить запись", "dat", "temp.ini") = 1)
{
file = fopen("$str", "rb") //или wb
...
fclose(file)
}
ret

file_dialog при этом возвращает в str что при загрузки что при записи числа, как же имя выбранного файла получить?

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Работа с файлами. Основы

Post by NightRadio » Tue Dec 30, 2008 1:07 pm

... file = fopen(str, "rb")
:)
Просто опять же из за упрощений в языке, запись вида "$str" запихивает в строку число, не вдаваясь в подробности того, на что это число указывает.

User avatar
vtl
Posts: 31
Joined: Sun Dec 28, 2008 6:41 pm
Location: Saint Petersburg, Russia
Contact:

Re: Работа с файлами. Основы

Post by vtl » Tue Dec 30, 2008 1:31 pm

так а какие варианты тогда возможны с открытием\сохранением???

User avatar
vtl
Posts: 31
Joined: Sun Dec 28, 2008 6:41 pm
Location: Saint Petersburg, Russia
Contact:

Re: Работа с файлами. Основы

Post by vtl » Tue Dec 30, 2008 2:18 pm

bla:
str = new_string(512)
if (file_dialog(str, "Загрузить запись", "dat", "temp.ini") = 1)
{
file = fopen(str, "rb") //или wb
...
fclose(file)
}
ret

вот

Post Reply