В официальных методических материалах по RobotC почти ничего не сказано про функции работы с файлами. Конечно, есть небольшой раздел в справке, идущей со средой программирования, но после его прочтения возникает больше вопросов, чем ответов. |
TFileHandle handle; TFileIOResult IO; string name="test.txt"; int size; int a; int b=0; byte x[63][99]; byte read=0;
task main() { //Открыть файл на чтение OpenRead(handle, IO, name, size); //В цикле проходим по всем строчкам в файле for(a=0; a<63; a++) { //В каждой строке, в цикле читаем по одному байту for(b=0; b<99; b++) { ReadByte(handle, IO, read); //результат чтения записываем в массив //при этом декодируем символьное представление //"0" или "1" в число 0 или 1 x[a][b] = read-48; } //Файл созданный в Windows содержит два дополнительных //байта в конце каждой строки, обозначающих ее завершение ReadByte(handle, IO, read); ReadByte(handle, IO, read); } //Закрываем файл Close(handle, IO); //Выводим данные из массива на экран for(a=0; a<63; a++) for(b=0; b<99; b++) if (x[a][b]>0) //В RobotC нет функции для вывода одной точки //рисуем линию с началом и концом в одном и том же месте nxtDrawLine(b, a, b, a); wait10Msec(100); }Данная программа по сути своей отображает картинку, закодированную в текстовом файле. Этот текстовый файл имеет простой формат - он состоит из строчек, состоящих из символов "0" и "1". Строчек ровно столько, сколько горизонтальных линий вмещается в экран NXT блока, т.е. 64. А каждая строчка состоит из 100 символов - столько точек может быть максимально в каждой горизонтальной линии. При этом "1" обозначает наличие точки в данном месте экрана, а "0" ее отсутствие.
Упрощено (т.е. не 100x64, а 10x5), файл, содержащий в себе картинку будет выглядеть следующим образом:
1000100010 1001010010 1110001110 1001010010 1000100010Следует отметить две вещи, которые при таком подходе к кодированию нужно учитывать.
- Хотя этого и не видно, но, поскольку файл создан в ОС Windows, каждая строка заканчивается двумя символами конца строки и перевода каретки (десятичные коды 10 и 13). Поэтому когда строчка считывается побайтно, то необходимо вычитать эти символы тоже - поэтому во внешнем цикле в программе Андрея стоят подряд две функции ReadByte, результаты работы которых никуда не записываются.
Тут может возникнуть вопрос, а почему сразу не считывать строчку из файла, которую потом уже разбирать на символы? Дело в том, что язык RobotC не поддерживает чтение построчно, хотя запись целыми строками при этом можно делать одной функцией. Вот такая странность! - При чтении каждого байта - считывается символьное обозначение "0" и "1". В десятичном коде, они имеют значение 48 и 49 соответственно. А в программе затем, подразумевается что оперировать нужно численными значениями 0 и 1. Поэтому в после чтения символы "0" и "1" декодируются к их цифирному значению. Делается это просто - из считанного десятичного кода вычитается 48, т.е. в итоге остается либо 0, либо 1.
Комментариев нет:
Отправить комментарий