Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 313
1

Задача про бинарный файл..

21.10.2011, 22:02. Просмотров 3146. Ответов 14
Метки нет (Все метки)

Добрый вечер)
Вот возникла очередная проблемка с задачей по СИ++. Задача звучит таким образом:
Создать бинарный файл f и записать в него действительные числа. Организовать просмотр бинарного файла и его обработку: найти сумму чисел, расположенных перед первым минимальным.
Начало задачи я смогу, как мне кажется выполнить самостоятельно, но я все никак не пойму, как именно искать сумму чисел, расположенных перед первым минимальным. ??? Объясните пожалуйста. Можно на русском))) НО лучше бы на СИ++
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2011, 22:02
Ответы с готовыми решениями:

Задача про провода: бинарный поиск
Дано N отрезков провода длиной L1, L2, ..., LN сантиметров. Требуется с помощью разрезания получить...

Сконвертировать текстовый файл в бинарный, переписать только положительные числа в другой бинарный файл
Бинарные файлы!! Помогите пожалуйста. Дано бинарный файл ( данные сначала в текстовом, конвертирую...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод)
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student {...

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

14
363 / 364 / 167
Регистрация: 11.06.2010
Сообщений: 703
21.10.2011, 22:06 2
Цитата Сообщение от Вася1q Посмотреть сообщение
Начало задачи я смогу, как мне кажется выполнить самостоятельно
Покажите
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 313
21.10.2011, 22:16  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <iostream>
using namespace std;
 
void create(void); 
void view(void);
void work(void);
 
int main(void)
{  create();
   view(); 
   work();
}
 
// определение функции создания бинарного файла
 
void create(void)
{ FILE * f;  
  int number, n;
  if ((f = fopen("D:\\file.dat","wb"))!= NULL)
   { cout << " Введите количество чисел :  "; 
      cin >> n;
       cout << " \nВведите целые числа : ";
Добавлено через 34 секунды
Так вроде)

Добавлено через 5 минут
Вот например, схожая задача :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <iostream>
using namespace std;
 
// прототипы функций создания, просмотра и
// обработки бинарного файла
 
void create(void); 
void view(void);
void work(void);
 
int main(void)
{  create();
   view(); 
   work();
}
 
// определение функции создания бинарного файла
 
void create(void)
{ FILE * f;  
  int number, n;
  if ((f = fopen("D:\\file.dat","wb"))!= NULL)
   { cout << " Введите количество чисел :  "; 
      cin >> n;
       cout << " \nВведите целые числа : ";
       for (int i = 0; i < n; i++)
        { cin >> number;
          fwrite(&number,sizeof(int),1,f); 
       }
     fclose(f); 
    cout << "\nЧисла записаны в бинарный файл!";
    } 
 else 
  printf("\nОшибка создания файла!\n");
}
 
// определение функции просмотра бинарного файла
 
void view(void)
{  int number;
   FILE * f;
   if ((f = fopen("D:\\file.dat","rb"))!= NULL)
   { cout << "\nПросмотр бинарного файла: ";
     while (fread(&number,sizeof(int),1,f))
         cout << number << " ";
      cout << "\n"; 
      fclose(f);
     }
   else printf("\nОшибка открытия файла!\n");
}
 
// определение функции обработки бинарного файла
 
void work(void)
{ int number; 
  FILE * f; 
  int  k = 0;
  if ((f = fopen("D:\\file.dat","rb"))!= NULL)
  { while (fread(&number,sizeof(int),1,f))
       if (number < 0) k++;
    cout << "\nКоличество отрицательных чисел = " << k;
    cout << "\n";  
    fclose(f);
  }
 else  printf("\nОшибка открытия файла!\n");
Добавлено через 1 минуту
Пытаюсь делать по аналогии, все упирается в нахождении суммы чисел, расположенных перед первым минимальным.
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
21.10.2011, 22:16 4
Создаешь цикл, который считывает и сравнивает числа и в итоге получаешь число допустим min_index, в котором хранится номер минимального числа (если при сравнении не рассматривать >= и <=), то это будет номер первого минимального числа. Далее создаешь еще один цикл, который изменяет свой параметр от 0 до min_index. Внутри цикла суммируется число. В итоге это число и будет искомым.
1
446 / 209 / 21
Регистрация: 07.10.2011
Сообщений: 462
21.10.2011, 22:18 5
Попробуй сделать так: сначала открываешь файл, просматриваешь его до конца и находишь в нем минимум, запоминаешь его или его позицию. Закрываешь файл. Открываешь заново и просматриваешь сначала, добавляя каждое прочитанное число к сумме, пока не дойдешь до минимума. Выводишь сумму на экран.
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
21.10.2011, 22:20 6
Можно изначально считать числа в массив, а потом работать с ним. Тогда не прийдется считывать числа с файла еще раз во втором цикле, но потребуется выделение памяти под этот массив. Делай как хочешь.
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 313
21.10.2011, 22:26  [ТС] 7
MrGluck, не...массивы мы еще не изучали. Но с ним можно было бы упростить решение.

Добавлено через 1 минуту
MrGluck, А вот предложение с двумя циклами ооочень интересное))) Но как мне кажется трудно осуществимое.

Добавлено через 58 секунд
aeshes, честно говоря, я вас не совсем понял...какими это действиями я должен открывать бинарник??
0
446 / 209 / 21
Регистрация: 07.10.2011
Сообщений: 462
21.10.2011, 22:26 8
Вася1q, у тебя всегда будет 2 цикла - один для поиска минимума, другой - для суммирования нужного количества чисел

C++
1
f = fopen("D:\\file.dat","wb")
это открытие файла для записи
с ключом "rb" - открытие для чтения
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
21.10.2011, 22:28 9
Цитата Сообщение от Вася1q Посмотреть сообщение
MrGluck, не...массивы мы еще не изучали. Но с ним можно было бы упростить решение.
Странно, файлы проходите, а массивы не прошли. Ну да пройдите сами, это не сложная тема.
Цитата Сообщение от Вася1q Посмотреть сообщение
Добавлено через 58 секунд
aeshes, честно говоря, я вас не совсем понял...какими это действиями я должен открывать бинарник??
ну например так:
C++
1
2
fopen(filename, "rb");
ifstream i(filename, ios::binary);
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 313
21.10.2011, 22:32  [ТС] 10
aeshes, Так..так уже немного начинаю понимать))) как составить цикл суммирования нужного кол-ва чисел я думаю вечерком и сам разобраться смогу, но как найти минимум??
aeshes, помогите пожалуйста составить это цикл.

Добавлено через 1 минуту
MrGluck, я и так собираюсь начать учить массивы, но срок на эту лабу поджимает...и пока хотя бы без массива сдать желательно.
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
21.10.2011, 22:34 11
Допустим есть массив чисел mass, содержащий n эл-тов.

C++
1
2
3
4
5
6
7
8
int min = mass[0];
int min_index = 0;
for (int i = 0; i < n; i++)
    if (mass[i] < min)
    {
        min_index = i;
        min = mass[i];
    }
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 313
21.10.2011, 22:38  [ТС] 12
MrGluck, эх....я же вам объясняю с массивами никак(( мне его просто не зачтут..
0
446 / 209 / 21
Регистрация: 07.10.2011
Сообщений: 462
21.10.2011, 22:39 13
Вася1q, напишу словами
Заводим переменную min того типа, которого у тебя числа в файле, и int index - номер минимума, int i - счетчик
min=первое_число_прочитанное_из файла
index=1;
i=1;
пока (не достигнут конец файла)
{
читаем следующее число;
i=i+1;
если (min>прочитанного) {min=прочитанное; index=i;}
}
Примерно так
P.S. MrGluck на примере массива тебе показал суть поиска
1
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 313
21.10.2011, 22:42  [ТС] 14
aeshes, спасибо) Теперь попробую всю эту информацию применить в создании программки. Еще раз спасибо всем кто откликнулся!
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 313
13.11.2011, 20:23  [ТС] 15
Форумчане, выручайте! Попытался сейчас совместить все элементы программы воедино, но видимо что-то не правильно(( помогите исправить.

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <iostream>
using namespace std;
 
// ïðîòîòèïû ôóíêöèé ñîçäàíèÿ, ïðîñìîòðà è
// îáðàáîòêè áèíàðíîãî ôàéëà
 
void create(void); 
void view(void);
void work(void);
 
int main(void)
{  create();
   view(); 
   work();
}
 
// îïðåäåëåíèå ôóíêöèè ñîçäàíèÿ áèíàðíîãî ôàéëà
 
void create(void)
{ FILE * f;  
  int number, n;
  if ((f = fopen("D:\\file.dat","wb"))!= NULL)
   { cout << " Ââåäèòå êîëè÷åñòâî ÷èñåë :  "; 
      cin >> n;
           cout << " \nÂâåäèòå öåëûå ÷èñëà : ";
           for (int i = 0; i < n; i++)
            { cin >> number;
                  fwrite(&number,sizeof(int),1,f); 
       }
         fclose(f); 
    cout << "\n×èñëà çàïèñàíû â áèíàðíûé ôàéë!";
        } 
 else 
  printf("\nÎøèáêà ñîçäàíèÿ ôàéëà!\n");
}
 
// îïðåäåëåíèå ôóíêöèè ïðîñìîòðà áèíàðíîãî ôàéëà
 
void view(void)
{  int number;
   FILE * f;
   if ((f = fopen("D:\\file.dat","rb"))!= NULL)
   { cout << "\nÏðîñìîòð áèíàðíîãî ôàéëà: ";
     while (fread(&number,sizeof(int),1,f))
             cout << number << " ";
          cout << "\n"; 
          fclose(f);
         }
   else printf("\nÎøèáêà îòêðûòèÿ ôàéëà!\n");
}
 
// îïðåäåëåíèå ôóíêöèè îáðàáîòêè áèíàðíîãî ôàéëà
 
void work(void)
{ int number; 
  FILE * f; 
  int  i = 0;
  int min = mass[0];
  int min_index = 0;
if ((f = fopen("D:\\file.dat","rb"))!= NULL)
if (mass[i] < min)
    {
        min_index = i;
        min = mass[i];
        cout << "\nÊîëè÷åñòâî îòðèöàòåëüíûõ ÷èñåë = " << min;
        cout << "\n";  
    fclose(f);
    }
 else  printf("\nÎøèáêà îòêðûòèÿ ôàéëà!\n");
 system("pause");
}
Добавлено через 14 часов 57 минут
....... =(

Добавлено через 6 часов 34 минуты
Ну помогите плиз!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2011, 20:23

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

Повреждается бинарный файл при попытке его записи в другой файл
Делаю автоматизированную сборку. Для этого нужно соединить три файла в один новый. Но почему-то...

Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой
Никак не получается отладить в BC++ 3.1. Как сделать в классах так, чтобы введённые данные...

Файл: Перенести в бинарный файл и данные из текстового...
Здравствуйте товарищи программисты. Коротко: нужно считывать информацию из текстового документа,...

Создать бинарный файл и текстовый файл
Вот, к примеру, я написал программу для введения 5 чисел в текстовый файл, а как будет выглядеть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.