Как читать и писать из файла.dat в Verifiedone

Я хочу прочитать и написать текстовый файл или файл.dat в verifyone для хранения данных на нем. Как я могу это сделать? вот мой код

int main()
{
  char buf [255];
  FILE *tst;
  int dsply = open(DEV_CONSOLE , 0);
  tst = fopen("test.txt","r+");
  fputs("this text should write in file.",tst);
  fgets(buf,30,tst);

  write(dsply,buf,strlen(buf));
  return 0;
}

1 ответ

Решение

Глава 3 "Руководства для программистов для Vx Solutions" ("23230_Verix_V_Operating_System_Programmers_Manual.pdf") посвящена управлению файлами и содержит все функции, которые я обычно использую при работе с файлами данных на терминале. Прочтите это, и я думаю, вы найдете все, что вам нужно.

Для начала вы захотите использовать open() вместе с флагами, которые вы хотите

  • O_RDONLY (только чтение)
  • O_WRONLY (только запись)
  • O_RDWR (прочти и напиши)
  • O_APPEND (Открывается с указателем положения файла в конце файла)
  • O_CREAT (создайте файл, если он еще не существует),
  • O_TRUNC (обрезать / удалить предыдущее содержимое, если файл уже существует),
  • O_EXCL (Возвращает значение ошибки, если файл уже существует)

В случае успеха open вернет положительное целое число - дескриптор, который можно использовать для последующего доступа к файлу. При неудаче возвращает -1;

Когда файл открыт, вы можете использовать read() а также write() манипулировать содержимым.

Обязательно позвони close() и передайте возвращаемое значение из open, когда вы закончите с файлом.

Ваш пример выше будет выглядеть примерно так:

int main()
{
  char buf [255];
  int tst;
  int dsply = open(DEV_CONSOLE , 0);
  //next we will open the file.  We will want to read and write, so we use
  // O_RDWR.  If the files does not already exist, we want to create it, so
  // we use O_CREAT.  If the file *DOES* already exist, we want to truncate
  // and start fresh, so we delete all previous contents with O_TRUNC
  tst = open("test.txt", O_RDWR | O_CREAT | O_TRUNC);

  // always check the return value.
  if(tst < 0)
  {
     write(dsply, "ERROR!", 6);
     return 0;
  }
  strcpy(buf, "this text should write in file.")
  write(tst, buf, strlen(buf));
  memset(buf, 0, sizeof(buf));
  read(tst, buf, 30);
  //be sure to close when you are done
  close(tst);

  write(dsply,buf,strlen(buf));
  //you'll want to close your devices, as well
  close(dsply);
  return 0;
}

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

  • SEEK_SET - начало файла
  • SEEK_CUR - Текущее местоположение указателя поиска
  • SEEK_END - конец файла

пример

SomeDataStruct myData;
...
//assume "curPosition" is set to the beginning of the next data structure I want to read
lseek(file, curPosition, SEEK_SET);
result = read(file, (char*)&myData, sizeof(SomeDataStruct));
curPosition += sizeof(SomeDataStruct);
//now "curPosition" is ready to pull out the next data structure.

Обратите внимание, что внутренний указатель файла уже AT "curPosition", но, делая это таким образом, я могу перемещаться вперед и назад по желанию, когда я манипулирую тем, что есть. Так, например, если бы я хотел вернуться к предыдущей структуре данных, я бы просто установил "curPosition" следующим образом:

curPosition -= 2 * sizeof(SomeDataStruct);

Если бы я не хотел отслеживать "curPosition", я мог бы также сделать следующее, что также переместит внутренний указатель файла в правильное место:

lseek(file, - (2 * sizeof(SomeDataStruct)), SEEK_CUR);

Вы можете выбрать тот метод, который лучше всего подходит для вас.

Другие вопросы по тегам