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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2011, 00:53   #1
JinAnton
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 54
Вопрос Программа на C++(работа с двоичным файлом))

Здравствуйте дорогие программисты и студенты!!! Мне очень нужна ваша помощь мне нужно написать срочно 2 проги иначе к экзамену не допустят а программист из меня пока никакой (1-й курс все таки) первую я написал а со второй незнаю с чего начать даже((( вот задание:

Дан файл, содержащий сведения об исторических событиях : название события, число, месяц и год. Найти все события, произошедшие в данный промежуток времени. Границы промежутка задаются числом, месяцем и годом. Реализовать на двоичных файлах с помощью структур данных (struct).


КТО МОЖЕТ ПОМОГИТЕ ПОЖАЛУЙСТА!!! Я работаю на Visual Studio 2008 (C++)
JinAnton вне форума Ответить с цитированием
Старый 05.01.2011, 13:16   #2
xDyPx
Форумчанин
 
Аватар для xDyPx
 
Регистрация: 21.01.2009
Сообщений: 148
По умолчанию

http://www.programmersforum.ru/showt...php?t=120210#5 - вот тут похожая тема разбиралась.

Чтобы "Найти все события, произошедшие в данный промежуток времени." нужно в цикле условие поставить, которое проверяло бы, входит в указанный промежуток времени данная запись или нет.
МОЙ САЙТ
Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали.
xDyPx вне форума Ответить с цитированием
Старый 05.01.2011, 13:28   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

создаешь структуру :
Код:
struct EventHistory{
     char name[50];
     int num, month, year;
}
делаешь массив этих структур и заносишь в них какие-либо данные. Открываешь файл в бинарном режиме("wb"). Пишешь массив структур в файл функцией fwrite. Считываешь диапазон времени у пользователя, считываешь записанный файл в массив структур(fread). Циклом находишь записи, произошедшие в данный промежуток времени.
NiCola999 вне форума Ответить с цитированием
Старый 05.01.2011, 17:33   #4
JinAnton
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 54
По умолчанию

А чем массив заполнить??? вопрос кажется глуппым понятно что датами и событиями а как именно это сделать вот пример объявления массива
EventHistory tab [50];
а как его лудше заполнить????
JinAnton вне форума Ответить с цитированием
Старый 05.01.2011, 18:07   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

можно сделать функцию что-то типа
Код:
void insert_data(EventHistory*  eh, char* name, int num, int month, int year){
       if(eh == NULL) return;
      strcpy(eh->name, name);
      eh->num = num;
      eh->month = month;
      eh->year = year;
}

//использование
EventHistory *ehistory;


insert_data(ehistory, "ВОВ", 22, 6, 1941);

Последний раз редактировалось NiCola999; 05.01.2011 в 18:12.
NiCola999 вне форума Ответить с цитированием
Старый 05.01.2011, 21:59   #6
JinAnton
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 54
По умолчанию

сделал двоичный файл с помощбю проги
Код:
#define _CRT_SECURE_NO_DEPRECATE
 
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>

int main() 
{
      setlocale( LC_ALL, "Russian" );
      // открытие файла на запись
      FILE *f;
      f = fopen( "istoriya.txt", "wb+" );
      if( f == NULL ) 
	  {
            printf( "Не удалось создать или перезаписать 'istoriya.txt'. Нажмите клавишу...\n" );
            _getch();
            return -1;
      }
      unsigned int num=0, month=0, year=0; // дата
      char name[50];      // событие
 
      // работа с файлом
      printf( "Создаётся база данных.\n\n" );
      while( true ) 
	  {
            printf( "Число (или 0 для выхода): " );
            scanf_s( "%d", &num );
            fflush(stdin);
			if( num==0 ) break;
			printf( "Месяц : " );
            scanf_s( "%d", &month );
            fflush(stdin);
			printf( "Год : " );
            scanf_s( "%d", &year );
            fflush(stdin);
            printf( "Событие: " );
            scanf_s( "%49s", name, 50 );
            fflush(stdin);
            //fprintf( f, "%d\t%s\t%g\n", num, name, rub );
            fwrite( &num, sizeof(num), 1, f );
			fwrite( &month, sizeof(month), 1, f );
			fwrite( &year, sizeof(year), 1, f );
            fwrite( name, sizeof(name), 1, f );
            printf( "Информация добавлена.\n\n" );
      }
      fclose(f);
      printf( "\nБаза данных'istoriya.txt' готова. Нажмите любую клавишу...\n" );
      _getch();
}
Решил проверить и написал такую прогу
Код:
#define _CRT_SECURE_NO_DEPRECATE
 
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>

#pragma pack(1)
struct istoriya {
      unsigned int num, month, year;       // дата
      char name[50];          // событие
};
#pragma pack()

int main()
{
      setlocale( LC_ALL, "Russian" );

      // открытие файла на чтение
      FILE *f;
      f = fopen( "istoriya.txt", "rb" );
      if( f == NULL ) 
	  {
            printf( "Не могу открыть 'istoriya.dat' на чтение. Нажмите клавишу...\n" );
            _getch();
            return -1;
      }

      istoriya k;

      // работа с файлом
      printf( "Просматривается база данных'istoriya.dat':\n\n" );
      while( true ) 
	  {
            fread( &k, sizeof(istoriya), 1, f );
            if( feof(f) ) break;

            printf( "%d.%d.%d: ", k.num, k.month, k.year );
            setlocale( LC_ALL, ".866" );
			fflush(stdin);
            printf( "%-49s\n", k.name );
            setlocale( LC_ALL, ".1251" );
			fflush(stdin);
      }
      fclose(f);
      printf( "Нажмите клавишу...\n" );
      _getch();
}
От событий осталось только первое слово

И где ошибка при создании или при проверке?????
JinAnton вне форума Ответить с цитированием
Старый 06.01.2011, 02:16   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

чет ты намудрил... вот тебе пример. Запись и чтение структуры из файла

Код:
#include <stdio.h>
#include <stdlib.h>

#define COUNT_NOTES 3

typedef struct {
        char name[50];
        int num, month, year;
} EventHistory;


void insert_data(EventHistory*  eh, char* name, int num, int month, int year){
      if(eh == NULL) return;
      strcpy(eh->name, name);
      eh->num = num;
      eh->month = month;
      eh->year = year;
}

void print_data(EventHistory eh){
      printf("Name: %s\nData: %d.%d.%d\n\n", eh.name, eh.num,
                                             eh.month,eh.year);
}

int main(int argc, char *argv[])
{
  int i,j;
  FILE *file = NULL;
  EventHistory *eh = NULL;
  eh = (EventHistory*) malloc(COUNT_NOTES*sizeof(EventHistory));
  memset(eh, 0, sizeof(eh)); // очищаем массив нулями
  
  file = fopen("ehistory.txt", "wb");
  insert_data(&eh[0], "event1", 12, 6, 2010);
  insert_data(&eh[1], "event2", 22, 1, 2009);
  insert_data(&eh[2], "event3", 31, 12, 2010);  

  //запись структур в файл
  for(i=0; i<COUNT_NOTES; i++){
       fwrite(&eh[i], 1, sizeof(eh[i]), file);        
  }
  fclose(file);  
  file = fopen("ehistory.txt", "rb");
  if(! file) { 
       free(eh); 
       exit(-1);
  }
  //чтение структур из файла (в i накапливается
  // кол-во найденных структур в файле)
  for(i=0; 1; i++){
       fread(&eh[i], 1, sizeof(eh[i]), file);
       if( feof(file)) break;
  }
  for(j=0; j<i; j++) print_data(eh[j]);
  
  fclose(file);  
  free(eh);
  system("PAUSE");	
  return 0;
}

Последний раз редактировалось NiCola999; 06.01.2011 в 02:23.
NiCola999 вне форума Ответить с цитированием
Старый 07.01.2011, 14:48   #8
JinAnton
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 54
По умолчанию

Кидает вот такие ошибки
1>.\main.cpp(14) : error C3861: 'strcpy': identifier not found
1>.\main.cpp(31) : error C3861: 'memset': identifier not found
И тем более по условию задачи мне уже дан двоичный файл!!!
JinAnton вне форума Ответить с цитированием
Старый 07.01.2011, 18:03   #9
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

Код:
#include <string.h>
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 07.01.2011, 18:27   #10
JinAnton
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 54
По умолчанию

а можно указать в моей проге ошибку???

Последний раз редактировалось JinAnton; 07.01.2011 в 18:33.
JinAnton вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлом.. dimorik Win Api 2 23.03.2010 21:26
Записать двоичным методом строку. Alex Cones Общие вопросы Delphi 9 09.03.2010 08:29
Обращение к двоичным файлам atenon Общие вопросы C/C++ 10 18.12.2009 11:21
Си++. работа с файлом milate Помощь студентам 0 08.06.2009 12:52
Работа с двоичным кодом lacost Общие вопросы Delphi 7 19.11.2008 10:38