/*Функция сохрания в файл из массива типа структуры. На вход принимает количество записей в БД.*/
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);
}
Работа с файлами на языке С.
Вообщем вопрос. Пишу курсовую на С, есть работа с базой данных, типа создание/просмотр/удаление/редактировании и проче...
Для записи в файл используется функция Save_file
Код:
То есть данные из структуры, записываются в файл.
Для чтения из файла используется функция 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);
}
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];
};
char name[15];
char famili[20];
};
Но, существует проблема в том, что вместе с введенными данными считывается из файла считывается символ конца строки и это нужно как то побороть..
Цитата: Fenja
Доброго времени суток.
Вообщем вопрос. Пишу курсовую на С, есть работа с базой данных, типа создание/просмотр/удаление/редактировании и проче...
Для записи в файл используется функция Save_file
То есть данные из структуры, записываются в файл.
Для чтения из файла используется функция Read_file
В результате содержимое файла считывается в структуру.
Но, существует проблема в том, что вместе с введенными данными считывается из файла считывается символ конца строки и это нужно как то побороть..
Вообщем вопрос. Пишу курсовую на С, есть работа с базой данных, типа создание/просмотр/удаление/редактировании и проче...
Для записи в файл используется функция 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);
}
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);
}
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];
};
char name[15];
char famili[20];
};
Но, существует проблема в том, что вместе с введенными данными считывается из файла считывается символ конца строки и это нужно как то побороть..
Строковый тип всегда заканчивается символом конца строки. А чем он вам мешает? Или вы имеете в виду символ перехода на новую строку \n?
Цитата:
Или вы имеете в виду символ перехода на новую строку \n?
Этим у меня отделяется записи в файле.
Цитата:
А чем он вам мешает?
При первом выводе с файла с пишу printf(); в списке параметров "\n" не ставлю и выводит с новой строки каждое поле. Затем, если считать базу из файла, добавить еще несколько записей и записать в файл, то в файле получаются лишние переносы строк.
Допустим в файле было записано
Код:
111
222
333
444
222
333
444
- две записи, считав из файла, добавив запись и записав в файл в файле вижу такое
Код:
111
222
333
444
555
666
222
333
444
555
666
Соответсвенно при последующем чтении с файла у меня читается ересь..
З.Ы. Объяснил как смог :)
RTFM
Я понял, что у fgets литера '\n' (новая строка) включается в строку.
Значит нужно использовать что то другое?..
Код:
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(res, n, fpFile);
if (res[strlen(res)-1] == '\n')
res[strlen(res)-1] = '\0';
return res;
}
И пользуйтесь fgets_new() на здоровье...
Цитата: 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(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);
char famili[20];
fscanf(fd, "%14s%19s", name, famili);
У меня файлы,с которыми я произвожу операции лежат в папке с проектом, открываются
Код:
f = fopen ("Baza.dat", "wt");
num = fopen ("num.txt", "wt");
num = fopen ("num.txt", "wt");
Как сделать так, что бы файлы брались из вложеной в проект папки, например date\ ?
Код:
f = fopen ("./date/Baza.dat", "wt");
Есть кусок кода
Код:
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;
}
fscanf(f, "%14s%19s%4d%14s%5d%5d", cur->name, cur->famili, &cur->date, cur->street, &cur->house, &cur->apartament);
first = cur;
}
Если файл нулевого размера, то при первом обращении к файлу feof возращает 0, хотя файл пустой, как от этого избавиться не знаю.
Если файл не нулевого размера, то все хорошо работает.
Код:
if (fscanf(f, "...", ...)!=EOF)
first = cur;
first = cur;