ДО курс по робототехнике

5 апреля 2013 г.

Работа с файлами в RobotC

(C)
В официальных методических материалах по 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
Следует отметить две вещи, которые при таком подходе к кодированию нужно учитывать.
  1. Хотя этого и не видно, но, поскольку файл создан в ОС Windows, каждая строка заканчивается двумя символами конца строки и перевода каретки (десятичные коды 10 и 13). Поэтому когда строчка считывается побайтно, то необходимо вычитать эти символы тоже - поэтому во внешнем цикле в программе Андрея стоят подряд две функции ReadByte, результаты работы которых никуда не записываются.
    Тут может возникнуть вопрос, а почему сразу не считывать строчку из файла, которую потом уже разбирать на символы? Дело в том, что язык RobotC не поддерживает чтение построчно, хотя запись целыми строками при этом можно делать одной функцией. Вот такая странность!
  2. При чтении каждого байта - считывается символьное обозначение "0" и "1". В десятичном коде, они имеют значение 48 и 49 соответственно. А в программе затем, подразумевается что оперировать нужно численными значениями 0 и 1. Поэтому в после чтения символы "0" и "1" декодируются к их цифирному значению. Делается это просто - из считанного десятичного кода вычитается 48, т.е. в итоге остается либо 0, либо 1.

Комментариев нет:

Отправить комментарий