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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2010, 23:18   #1
madmonk
 
Регистрация: 07.12.2009
Сообщений: 9
По умолчанию Работа с бинарным файлом (С)

Дан бинарный файл, содержащий целые числа (тип short int). Удалить из файла все серии,
длина которых кратна числу N (вводится пользователем).

Программа создания бинарного файла
Код:
#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[]) {
  char str[101], bin[5] = ".bin";
  puts("Vvedite nazvanie faila: ");
  scanf("%s", str);
  strcat(str,bin); 
  short int buf, n;
  puts("Vvedite kolichestvo vvodimix chisel: "); 
  scanf("%d", &n);
  FILE *f;
  f=fopen(str, "wb");
  fflush(f); 
  for(short int i=1; i<=n; i++) {
    scanf("%d", &buf);
    fwrite(&buf, sizeof(short int), 1, f);
  }
  fclose(f);
  return 0;
}
Программа чтения из бинарного файла
Код:
//подключение библиотеки стандартного ввода и вывода
#include<stdio.h>
int main(int argc, char *argv[])
{
	//объявление переменных программы
	short int buf,k;
	//объявление файловой переменной
	FILE *f=NULL;
	//Открытие бинарного файла
	//для чтения и записи с проверкой
	f=fopen(argv[1],"rb+");
	//Если файл открыть не удалось, то
	if (f==NULL)
	{
		//вывод сообщения
		puts("FAIL NE NAIDEN!");
		//и выход
		return 0;
	}
	//чтение первого значения из файла
	//если файл пустой, то
	if (fread(&buf, sizeof(short int), 1, f)!=1)
	{
		//вывод сообщения
		puts("PUSTOI FAIL!");
		//и выход
		return 0;
	}
	//закрываем файл
	fclose(f);
	//Открытие файла для чтения и записи с проверкой
	//указатель становится на первый элемент
	f=fopen(argv[1],"rb+");
	//пока не конец файла
	while(!feof(f))
	{
		//считываем элемент
		fread(&buf, sizeof(short int), 1, f);
    printf("%5d", buf);
	}

	fclose(f);
	//чтобы окно сразу не закрылось
	//ожидаем нажатую клавишу
  scanf("%d", &k);
	return 0;
}
Как реализовать удаление всех серий,
длина которых кратна числу N (вводится пользователем)?
madmonk вне форума Ответить с цитированием
Старый 29.04.2010, 22:35   #2
madmonk
 
Регистрация: 07.12.2009
Сообщений: 9
По умолчанию

Первый исходник создает бинарный файл с расширением .bin

Вот реализована программа удаления серий, но запись не работает вылетает ошибка
Код:
//подключение библиотеки стандартного ввода и вывода
#include<stdio.h>
int main(int argc, char *argv[])
{
	//объявление переменных программы
	short int buf,r;
	//объявление файловой переменной
	FILE *f=NULL;
	//Открытие бинарного файла
	//для чтения и записи с проверкой
	f=fopen(argv[1],"rb+");
	//Если файл открыть не удалось, то
	if (f==NULL)
	{
		//вывод сообщения
		puts("FAIL NE NAIDEN!");
		//и выход
		return 0;
	}
	//чтение первого значения из файла
	//если файл пустой, то
	if (fread(&buf, sizeof(short int), 1, f)!=1)
	{
		//вывод сообщения
		puts("PUSTOI FAIL!");
		//и выход
		return 0;
	}
	//закрываем файл
	fclose(f);
	//Открытие файла для чтения и записи с проверкой
	//указатель становится на первый элемент
	f=fopen(argv[1],"rb+");
  unsigned cnt = 0;  //Счетчик строк в файле
	//пока не конец файла
	while(!feof(f))
	{
		//считываем элемент
		fread(&buf, sizeof(short int), 1, f);
        cnt++;
	}
  short int bufmas[cnt];
  short int ds=1, n, dels=0;//Длина серии, сумма удаленных чисел
	fseek(f,0,SEEK_SET);  //Возврат к началу файла
  //Перенос записейв в массив
  for(int i=1; i<cnt; i++) {
  fread(&buf, sizeof(short int), 1, f);
  printf("%6d", buf);
  bufmas[i]=buf;
  }
  fclose(f);
  puts("\nVvedite dliny serii: "); 
  scanf("%d", &n);
  int i=0,j=1;
  while(i<cnt-2) {
  i++;
  if (bufmas[i]==bufmas[i+1]) ds++;
  if (ds==n && bufmas[i+1]!=bufmas[i+2]) {
    ds=1;
    dels=dels+n;
    while(i<=cnt) {
       bufmas[i+2-n]=bufmas[i+2];
        i++;
    }
    i=0;
  }
  }
    for(int i=1; i<cnt-dels; i++) {
    printf("%6d", bufmas[i]);	
   }
   fclose(f);
   remove(argv[1]);
   f=fopen(argv[1],"wb+");
 for(int i=1; i<cnt-dels; i++) {
  buf=bufmas[i];
  printf("%d", &buf);
   fwrite(&buf, sizeof(short int), 1, f);
    }
   // free(bufmas);
  //  fwrite(&bufmas, sizeof(short int), cnt-dels, f);
    fclose(f);
	//чтобы окно сразу не закрылось
	//ожидаем нажатую клавишу

  scanf("%d", &r);
	return 0;
}
как исправить запись в файл
madmonk вне форума Ответить с цитированием
Старый 30.04.2010, 00:00   #3
madmonk
 
Регистрация: 07.12.2009
Сообщений: 9
По умолчанию

Исправил, вроде работает корректно (проверьте пожалуйста)
Код:
//подключение библиотеки стандартного ввода и вывода
#include<stdio.h>
int main(int argc, char *argv[])
{
	//объявление переменных программы
	short int buf,r;
	//объявление файловой переменной
	FILE *f=NULL;
  // argv[1]="vjl.bin";
	//Открытие бинарного файла
	//для чтения и записи с проверкой
	f=fopen(argv[1],"rb+");
	//Если файл открыть не удалось, то
	if (f==NULL)
	{
		//вывод сообщения
		puts("FAIL NE NAIDEN!");
		//и выход
		return 0;
	}
	//чтение первого значения из файла
	//если файл пустой, то
	if (fread(&buf, sizeof(short int), 1, f)!=1)
	{
		//вывод сообщения
		puts("PUSTOI FAIL!");
		//и выход
		return 0;
	}
	//закрываем файл
	fclose(f);
	//Открытие файла для чтения и записи с проверкой
	//указатель становится на первый элемент
	f=fopen(argv[1],"rb+");
  unsigned cnt = 0;  //Счетчик строк в файле
	//пока не конец файла
	while(!feof(f))
	{
		//считываем элемент
		fread(&buf, sizeof(short int), 1, f);
        cnt++;
	}
  short int bufmas[cnt+2];
  short int ds=1, n, dels=0;//Длина серии, сумма удаленных чисел
	fseek(f,0,SEEK_SET);  //Возврат к началу файла
  //Перенос записейв в массив
  for(int i=1; i<cnt; i++) {
  fread(&buf, sizeof(short int), 1, f);
  printf("%6d", buf);
  bufmas[i]=buf;
  }
  fclose(f);
  puts("\nVvedite dliny serii: "); 
  scanf("%d", &n);
  int i=0;
  while(i<cnt) {
  i++;
  if (bufmas[i]==bufmas[i+1]) ds++;
  if (ds==n && bufmas[i+1]!=bufmas[i+2]) {
    ds=1;
    dels=dels+n;
    while(i<cnt) {
       bufmas[i+2-n]=bufmas[i+2];
        i++;
    }
    i=0;
  }
  }
   for(int i=1; i<cnt-dels; i++) {
   printf("%6d", bufmas[i]);	
   }
   
  
   f=fopen(argv[1],"wb+");
   for(int i=1; i<cnt-dels; i++) {
  // buf=bufmas[i];
  // printf("%d", buf);
   fwrite(&bufmas[i], sizeof(short int), 1, f);
    }
 //   free(bufmas);
 //   fwrite(&bufmas, sizeof(short int), cnt-dels, f);
   fclose(f);
	//чтобы окно сразу не закрылось
	//ожидаем нажатую клавишу

  scanf("%d",r);
	return 0;
}
madmonk вне форума Ответить с цитированием
Старый 20.11.2010, 17:48   #4
H1ghlander
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 19
По умолчанию

Что-то тут не то.
Я взял код с первого поста, записываю первой программой в бинарный файл числа, а когда вывожу с помощью второй появляется лишний символ (дублируется последнее введенное число)
Помогите найти ошибку в его коде.
H1ghlander вне форума Ответить с цитированием
Старый 20.11.2010, 20:58   #5
H1ghlander
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 19
По умолчанию

Цитата:
Сообщение от H1ghlander Посмотреть сообщение
Что-то тут не то.
Я взял код с первого поста, записываю первой программой в бинарный файл числа, а когда вывожу с помощью второй появляется лишний символ (дублируется последнее введенное число)
Помогите найти ошибку в его коде.
up
нужно срочно.
H1ghlander вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлом Leoman Помощь студентам 0 02.04.2010 21:57
Работа с файлом orkus Общие вопросы Delphi 4 02.04.2010 04:51
работа с файлом Cpluser Общие вопросы .NET 3 22.11.2009 22:45
работа с бинарным файлом Геннадий Win Api 8 22.10.2009 18:49
работа с бинарным файлом Bayazet Помощь студентам 3 17.03.2009 15:37