Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2012, 23:47   #1
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
Вопрос Удаление структуры из файла

Добрый вечер

Есть файл с элементами структурного типа film

Код:
struct film                  
{
 char *name;                 
 char *description;           
 char *genre;                 
 int year;                   
 char *country;             
 char *director;          
 char *cast;                 
 int time;                   
 film *next;                 
};
Функция DeleteFilm удаляет один блок (структурный элемент) в файле путём примитивного переписывания файла, только уже без лишнего блока.
Чтобы было понятней сразу объясню основную суть.
Считываются все блоки в файле, затем пользователь вводит название, которое хочет удалить (поле name в структуре) и затем всё кроме этого названия переписывается в этот же файл. Проблема в считывании. Вот код.

Код:
int DeleteFilm(char *filename)
{ 	
 if(filename[0]==' ')
 {
  puts("No file");
  getch(); 
  return 0;
 } 
 
 FILE *f;
 film *q;
 int i,j=0;
 
 char *str=(char*)calloc(100,sizeof(char));  
 q=(film*)calloc(100,sizeof(film));
 q->name=(char*)calloc(100,sizeof(char));
 q->description=(char*)calloc(100,sizeof(char));
 q->genre=(char*)calloc(100,sizeof(char));
 q->director=(char*)calloc(100,sizeof(char));
 q->cast=(char*)calloc(100,sizeof(char));
 q->country=(char*)calloc(100,sizeof(char));

 f=fopen(filename,"a+t");
 if(feof(f))
 {
  puts("Nothing");
  getch();
  return 0;
 }  
 puts("What object delete?");
 gets(str);
 while(!feof(f)) //собственно после 1 прохода       
 {                 //по этому циклу программа
  fscanf(f,"%s\n",q[j].name); //уже не работает
  fscanf(f,"%s\n",q[j].description);
  fscanf(f,"%s\n",q[j].genre);
  fscanf(f,"%s\n",q[j].country);
  fscanf(f,"%s\n",q[j].director);
  fscanf(f,"%s\n",q[j].cast);  
  j++;
 }
 fclose(f);
 f=fopen(filename,"w+t");
 for(i=0;i<j;i++)
 {    if(q[i].name[0]!=str[0])
      {
       fprintf(f,"%s\n",q[i].name);
       fprintf(f,"%s\n",q[i].description);
       fprintf(f,"%s\n",q[i].genre);
       fprintf(f,"%s\n",q[i].country);
       fprintf(f,"%s\n",q[i].director);
       fprintf(f,"%s\n",q[i].cast);
       fprintf(f,"%d\n",q[i].year);
       fprintf(f,"%d\n",q[i].time);
    }
 }
 fclose(f);
}

Заранее благодарна.

Последний раз редактировалось Axrik; 06.06.2012 в 23:59.
Axrik вне форума Ответить с цитированием
Старый 09.06.2012, 11:20   #2
margosh
Новичок
Джуниор
 
Регистрация: 15.05.2012
Сообщений: 1
По умолчанию

Возможно, вмето конструкций типа :
fscanf(f,"%s\n",q[j].country);
Вам стоит использовать :
fgets(q[j].country, 100, f);
эта функция считывает сроку пока не встретит символ перевода строки, IMXO, так как у Вас в структуре все поля - строки, она лучше для этого подойдет. Не уверена, что писать "\n" в fscanf - корректно.
margosh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись структуры из файла Evgeniy21 Общие вопросы C/C++ 2 15.05.2012 13:54
УДаление строки из файла методом создания временного файла. dykatob Общие вопросы C/C++ 3 28.05.2011 01:46
Загрузка структуры из файла mrCloud Общие вопросы Delphi 1 14.05.2011 15:31
Удаление(добавление) поля из(в) структуры kilgoreq Помощь студентам 0 22.02.2011 00:59
Чтение структуры файла SDK Помощь студентам 4 23.01.2008 19:30