Мы переехали http://www.webxakep.net

Понедельник, 23.12.2024
На главную · Регистрация · Войти · Пользователи · User`Bars · Обратная связь · WebTools · Последние сообщения · Поиск

  • Страница 1 из 1
  • 1
Модератор форума: 3xstie  
6.язык си. работа с файловой системой

3xstieДата: Понедельник, 14.01.2008, 00:57 | Сообщение # 1
Полковник
Группа: ◄Модератор►
Сообщений:163
Статус: Offline
Всем привет.
Седня продолжим изучение СИ. А имено работу с файлалами. Создадим две программы,
одну на стандартной библиотеке, другую на системных вызовах. Обе программы создадут по файлу, и запишут туда некую строку веденную пользователем.

Поехали!

1.1 Стандартная библиотека.

fp_1.c

Code

#include <stdio.h>

#define MAX 512

int main(void)
{
    FILE *fp;
    char buffer[MAX];   
      
    if ((fp = fopen("test.txt", "w+"))==NULL)   
    {
      printf("He удается открыть файл.\n");
      exit(1);
    }
        
    printf("введите строку: ");    
    gets(buffer);
      
    fputs(buffer, fp);
      
    fclose(fp);
    return 0;
}     

Как видим все просто.
В 3 строке определяем значение MAX равное 512.
В 5 открываем нашу функцию main
В 7 создаем указатель на структуру FILE(для простоты можно обозвать указатель файла). Она описана в заголовочном файле stdio.h. После этого мы можем работать с этим указателем, открывать, создавать, записывать, читать и т.п. из файла, используя этот указатель.
В 8 создаем переменную типа chat(символьная), и задаем ее размер в байтах, ранее определенный в строке 3.
В 10 строке открываем файл функцией fopen, которая как-раз возращает файловый указатель, и теперь используя его, мы будем работать с данным файлом. Эту функцию мы тут же проверяем if на нулевое значение (NULL)и если оно действительно, выводим строку (12 printf), и выход без продолжения.
Вот общий вид функции open

Code

#include <stdio.h>
FILE *fopen(const char *fname, const char *mode);

где:
const char *fname - имя нашего с вами файла.
const char *mode - режим открытия.
Режимов может быть:
"r" Открывает текстовый файл для чтения
"w" Создает текстовый файл для записи
"а" Дописывает в текстовый файл
"rb" Открывает двоичный файл для чтения
"wb" Создает двоичный файл для записи
"ab" Дописывает в двоичный файл
"r+" Открывает текстовый файл для чтения и записи
"w+" Создает текстовый файл для чтения и записи
"а+" Открывает текстовый файл для чтения и записи
"rb+" или "r+b" Открывает двоичный файл для чтения и записи
"wb+" или "w+b" Создает двоичный файл для чтения и записи
"ab+" или "а+b" Открывает двоичный файл для чтения и записи

В 16-17 строке, просим пользователя вести какую-то строку, и тут же забираем ее функцией gets(get получить s-string - строку) в переменную buffer.
В 19 строке функцией fputs выводим в файловый укзатель fp наш буфер где находится строка.
21 закрываем указатель файла и завершаем нашу программу.
Все просто!!!


the daemons are no longer just in my head.
 


3xstieДата: Понедельник, 14.01.2008, 00:57 | Сообщение # 2
Полковник
Группа: ◄Модератор►
Сообщений:163
Статус: Offline
2.1. Системные вызовы работы с файлами.

fd_1.c

Code

#include <stdio.h>
#include <fcntl.h>

#define BUF 512

int main(int argc, char *argv[])
{
     int fd;
     char buf[BUF];

     if (argc != 2)
     {
         printf("use: fd_1 [имя файла]");
         exit(1);
     }
     fd = open(argv[1], O_WRONLY|O_TRUNC|O_CREAT, 0777);
      
      
     printf("ведите строку: \n");
     gets(buf);
      
     printf("%s", &buf);
     write(fd, buf, strlen(buf));
      
     close(fd);             
     return 0;
}

Похожая программа.)
в инклуде появляется заголовочный файл fcntl.h, значит будем работать с файлами припомощи дискрипторов.

Вообще в unix весь ввод вывод идет через файлы(вообще все, те же терминалки, или физические устройства.)
Перед какими нить действиями с ними, мы сообщаем системе об этом, она в свою очередь проверяет имеете ли вы право поступать таким образом (существует лиэтот файл?) и если все норма) то возращает в программу не большое положительное число, которое называется дискриптором файла. Дальшейшая работа с файлом(запись чтение, изменение прав) идет через него. Более подробно можно почитать в любом спраочнике по unix.
Все тоже, определяем значением BUF 512, объявляем целое число fd, которое будем использовать для дескриптора.

проверяем значение argc(кол-во параметров при вызове программы). Т.е. если их не будет два, программа завершает свою работу с выводом подсказки. Если параметра два(а имено имя программы и имя файла, с которым будем работать), мы вызываем функцию open.
Замечу раньше юыла функция creat длс создания и open для открытия, сейчас все это можно решить одной функцией open
общий вид программы.

Code

#include <fcntl.h>

int open (pathname, oflag, pmode);

где
athname - имя файла.
oflag - флаги
pmode - режим(права, коды доступа)

флаги:
O_RDONLY - открыть только на чтение;
O_WRONLY - открыть только на запись;
O_RDWR - открыть и на чтение, и на запись;
O_CREAT - файл должен быть создан, если его не было;
O_TRUNC - если файл уже существует, то он должен быть опустошен при открытии.

pmode - мы создаем все-для-всех, т.е. 777 - rwxrwxrwx(более подробно о правах доступа читайте в любом издании по unix).

После вызова open и открытия/создания файла, мы просим вести строку, захватываем ее как в предыдущем примере функцией gets и помещаем ее в переменную buf.
Далее следует функция write.
Первый аргумент функции файловый дескриптор, второй наш с вами буфер, и третий размер данных, который мы подсчитываем функцией strlen(string lengh длина строки).
В принципе все просто!!!
компилирируем и смотрим файл в двух вариантах:

Code

$ gcc -s fp_1.c -o fp_1
$ ./fp_1
введите строку: дарофф!!!
$ cat ./test.txt
дарофф!!!

Code

$ gcc -s fd_1.c -o fd_1
$ ./fd_1
use: test1 [имя файла]
$ ./fd_1 text
ведите строку:
дарофф!!!
$ cat ./text
дарофф!!!
$

PS. Подумал я и решил, полностью описывать все функции нет смысла, так как есть руководства и целая куча различных изданий.
Так что я буду кусками выхватывать. Чуть-чуть из стандартных библиотек, чуть-чуть из файлового ввода/вывода.
Слудующая тема сокеты(sockets).
Вот тут то мы и развернемся на полную!!!:)


the daemons are no longer just in my head.
 

  • Страница 1 из 1
  • 1
Поиск:
..:WX Group:..
WebXakep 2007 - 2008 year.
Desing by arXRush & ArxWolf :)
Все прова принадлежат ArxWolf © Webxakep.net, все представленные материалы на портале в целях ознакомления.[Хакерство и Безопасность]
Форум посвящённый сетевой безопасности, хакерству, исследованию, проникновению. Есть темы такие как : Основы новичкам, BUGTRAQ, ICQ, Email, IRC, Skype, MSN, Крякерам, Фрикерам, Мобильные устройства, Вирусология, Кодинг, ОС, Soft, Халява, ЖелезО, Купля, Продажа, Обмен, Трёпка, Книги, Статьи, Новости, Группировки, Взлом.

Rambler's Top100