Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с файлами на языке С.

14K
28 сентября 2009 года
Fenja
138 / / 20.03.2009
Доброго времени суток.
Вообщем вопрос. Пишу курсовую на С, есть работа с базой данных, типа создание/просмотр/удаление/редактировании и проче...
Для записи в файл используется функция Save_file
Код:
/*Функция сохрания в файл из массива типа структуры. На вход принимает количество записей в БД.*/
void Save_file (int k)
{
    FILE *f;                            //Указатель на файл базы данных
    FILE *num;                          //Указатель на файл с числом записей
    f= fopen ("Baza.dat", "wt");            //создаем файл на запись
    num= fopen ("num.txt", "wt");
//  printf ("\n\nCozdanie BD\n");
    if ((f==NULL)|| (num==NULL))        //если при создании файла ошибка, то выдаем сообщение
        printf ("File not open");
    else {
        for (i = 0; i<k; i++){
          fprintf(f,"%s\n", &a.name);       //запись имени в файл
          fprintf (f,"%s\n", &a.famili);    //запись фамилии в файл
        }
    }
    //printf ("Kol-vo zapisei= %d\n",kol);
    fprintf (num, "%d",kol); //записываем количество записей в файл
    fclose (f); //закрываем файл базы данных
    fclose(num);
}

То есть данные из структуры, записываются в файл.
Для чтения из файла используется функция Read_file
Код:
/*Функция чтения базы данных из файла. Возвращает количество записей в файле.*/
int Read_file ()
{
    FILE *f;                                //указатель на файл
    FILE *num;
    f= fopen ("Baza.dat", "r");             //открываем файл на чтение
    num = fopen ("num.txt","r");
    if ((f==NULL)||(num==NULL))             // если при октрытии файла ошибка, то выдаем сообщение
        printf ("File not open");
    else {
        fscanf(num, "%d", &kol);            //читаем из файла количество записей в БД.
        for (i = 0;i<kol ; i++){
          fgets (a.name, 15, f);            //читаем в структуру данные
          fgets (a.famili, 20, f);
        }
    }
    return (kol);
    fclose (f);                             // закрываем файл
    fclose (num);
}

В результате содержимое файла считывается в структуру.
 
Код:
struct baza {
        char name[15];
        char famili[20];
};

Но, существует проблема в том, что вместе с введенными данными считывается из файла считывается символ конца строки и это нужно как то побороть..
18K
29 сентября 2009 года
s-ilent
58 / / 30.09.2008
Цитата: Fenja
Доброго времени суток.
Вообщем вопрос. Пишу курсовую на С, есть работа с базой данных, типа создание/просмотр/удаление/редактировании и проче...
Для записи в файл используется функция Save_file
Код:
/*Функция сохрания в файл из массива типа структуры. На вход принимает количество записей в БД.*/
void Save_file (int k)
{
    FILE *f;                            //Указатель на файл базы данных
    FILE *num;                          //Указатель на файл с числом записей
    f= fopen ("Baza.dat", "wt");            //создаем файл на запись
    num= fopen ("num.txt", "wt");
//  printf ("\n\nCozdanie BD\n");
    if ((f==NULL)|| (num==NULL))        //если при создании файла ошибка, то выдаем сообщение
        printf ("File not open");
    else {
        for (i = 0; i<k; i++){
          fprintf(f,"%s\n", &a.name);       //запись имени в файл
          fprintf (f,"%s\n", &a.famili);    //запись фамилии в файл
        }
    }
    //printf ("Kol-vo zapisei= %d\n",kol);
    fprintf (num, "%d",kol); //записываем количество записей в файл
    fclose (f); //закрываем файл базы данных
    fclose(num);
}

То есть данные из структуры, записываются в файл.
Для чтения из файла используется функция Read_file
Код:
/*Функция чтения базы данных из файла. Возвращает количество записей в файле.*/
int Read_file ()
{
    FILE *f;                                //указатель на файл
    FILE *num;
    f= fopen ("Baza.dat", "r");             //открываем файл на чтение
    num = fopen ("num.txt","r");
    if ((f==NULL)||(num==NULL))             // если при октрытии файла ошибка, то выдаем сообщение
        printf ("File not open");
    else {
        fscanf(num, "%d", &kol);            //читаем из файла количество записей в БД.
        for (i = 0;i<kol ; i++){
          fgets (a.name, 15, f);            //читаем в структуру данные
          fgets (a.famili, 20, f);
        }
    }
    return (kol);
    fclose (f);                             // закрываем файл
    fclose (num);
}

В результате содержимое файла считывается в структуру.
 
Код:
struct baza {
        char name[15];
        char famili[20];
};

Но, существует проблема в том, что вместе с введенными данными считывается из файла считывается символ конца строки и это нужно как то побороть..


Строковый тип всегда заканчивается символом конца строки. А чем он вам мешает? Или вы имеете в виду символ перехода на новую строку \n?

14K
29 сентября 2009 года
Fenja
138 / / 20.03.2009
Цитата:
Или вы имеете в виду символ перехода на новую строку \n?


Этим у меня отделяется записи в файле.

Цитата:
А чем он вам мешает?


При первом выводе с файла с пишу printf(); в списке параметров "\n" не ставлю и выводит с новой строки каждое поле. Затем, если считать базу из файла, добавить еще несколько записей и записать в файл, то в файле получаются лишние переносы строк.
Допустим в файле было записано

 
Код:
111
222
333
444

- две записи, считав из файла, добавив запись и записав в файл в файле вижу такое
 
Код:
111

222

333

444

555
666

Соответсвенно при последующем чтении с файла у меня читается ересь..
З.Ы. Объяснил как смог :)
260
29 сентября 2009 года
Ramon
1.1K / / 16.08.2003
RTFM fgets
14K
29 сентября 2009 года
Fenja
138 / / 20.03.2009
Ramon,
Я понял, что у fgets литера '\n' (новая строка) включается в строку.
Значит нужно использовать что то другое?..
278
29 сентября 2009 года
Alexander92
1.1K / / 04.08.2008
 
Код:
char *fgets_new(char *res, int n, FILE *fpFile) {
   fgets(res, n, fpFile);
   if (res[strlen(res)-1] == '\n')
      res[strlen(res)-1] = '\0';
   return res;
}


И пользуйтесь fgets_new() на здоровье...
260
29 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Alexander92
 
Код:
char *fgets_new(char *res, int n, FILE *fpFile) {
   fgets(res, n, fpFile);
   if (res[strlen(res)-1] == '\n')
      res[strlen(res)-1] = '\0';
   return res;
}


И пользуйтесь fgets_new() на здоровье...



А может научимся обходиться без велосипедов педальных и не писать как индусы с китайцами?

 
Код:
char name[15];
char famili[20];
fscanf(fd, "%14s%19s", name, famili);
14K
02 октября 2009 года
Fenja
138 / / 20.03.2009
Еще вопрос :)
У меня файлы,с которыми я произвожу операции лежат в папке с проектом, открываются
 
Код:
f = fopen ("Baza.dat", "wt");          
    num = fopen ("num.txt", "wt");

Как сделать так, что бы файлы брались из вложеной в проект папки, например date\ ?
260
02 октября 2009 года
Ramon
1.1K / / 16.08.2003
 
Код:
f = fopen ("./date/Baza.dat", "wt");
14K
10 октября 2009 года
Fenja
138 / / 20.03.2009
Хм.. возникла проблема при чтении с файла.
Есть кусок кода
 
Код:
if (feof(f)==0){   
                fscanf(f, "%14s%19s%4d%14s%5d%5d", cur->name, cur->famili, &cur->date, cur->street, &cur->house, &cur->apartament);
                first = cur;
            }

Если файл нулевого размера, то при первом обращении к файлу feof возращает 0, хотя файл пустой, как от этого избавиться не знаю.
Если файл не нулевого размера, то все хорошо работает.
297
10 октября 2009 года
koodeer
1.2K / / 02.05.2009
 
Код:
if (fscanf(f, "...", ...)!=EOF)
first = cur;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог