Глава 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
(Возвращает значение ошибки, если файл уже существует)
На success, open вернет положительное целое число, которое является дескриптором, который может использоваться для последующего доступа к файлу. При сбое он возвращает -1;
Когда файл открыт, вы можете использовать read()
и write()
для управления содержимым.
Обязательно позвоните close()
и передайте возвращаемое значение из открытого файла, когда вы закончите с файлом.
Ваш пример выше будет выглядеть примерно так:
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
- 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.
Учтите, что внутренний указатель файла уже находится в «curPosition», но при этом он позволяет мне двигаться вперед и назад по мере того, как я манипулирую тем, что есть.Так, например, если бы я хотел, чтобы вернуться к предыдущей структуры данных, я бы просто установить «curPosition» следующим образом:
curPosition -= 2 * sizeof(SomeDataStruct);
Если бы я не хотел, чтобы следить за «curPosition», я мог бы также сделать следующее, который также перемещает внутренний указатель файла на нужное место:
lseek(file, - (2 * sizeof(SomeDataStruct)), SEEK_CUR);
Вы добираетесь, чтобы выбрать тот метод, который лучше работает для вас.
Вам редко приходится читать и записывать в файл одновременно, поэтому не используйте режимы '+', пока не будете знакомы с файловыми вводами-выводами. Вместо этого откройте файл с помощью '' w '', напишите ему, закройте его. Затем снова откройте его с помощью «r» ', прочитайте его и закройте. Сделайте привычку проверять возвращаемые значения для условий ошибки и спаривания каждого 'fopen' с помощью соответствующего' fclose'. –
как я могу искать в этом файле? по команде? – farshid
Не совсем понятно, что вы хотите. Думаю, ваш вопрос о чтении и письме неверен. (Если вы хотите иметь структуру, похожую на базу данных, загрузите ее в память, работайте с базой данных в памяти и затем скопируйте ее в файл снова. В любом случае прочитайте хороший учебник по файловым ввода-выводам в C.) –