Обработка текстового файла и запись в бинарный файл - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задача: Создать бинарный файл f и записать в него действительные числа. Организовать просмотр бинарного файла и его обработку: найти сумму чисел, расположенных после первого минимального. Результат сохранить в текстовом файле. На данный момент у меня выполнено часть задачи, после чего вообще запуталась:
// прототип функции обработки текстового файла
   void work(void);
// прототип функции просмотра бинарного файла
   void view(void);
 
void main(void)
 {   work(); //вызов функции обработки текстового файла   
     view(); //вызов функции просмотра бинарного файла
 }
 
// определение функции обработки текстового файла
void work(void)
{ int a;
   FILE * fb;
   ifstream f; // объявление потока для чтения
   f.open("D:\\abcd.txt");  // режим ios::in
   fb = fopen("D:\\abcd.dat","wb");
   if (f) { while(!f.eof())
              { f >> a; // чтение из файла
                if (a > 0)   
                   fwrite(&a,sizeof(a),1,fb);
 
              } f.close();   
                fclose(fb);
           } 
   else cout << "File not found \n";
  cout << "File write! \n";getch();
 }
 
// определение функции просмотра бинарного файла
void view(void)
{  int a;
   FILE * fb;
   if ((fb = fopen("D:\\abcd.dat","rb"))!= NULL)
   {
     while (fread(&a,sizeof(int),1,fb))
         cout << a << " " ;
     cout << "\n";
     getch();
     fclose(fb);
   }
   else { printf("Error open file!\n"); getch(); }
}
Извиняюсь, если что-то не так указала, на данный момент меня трудно назвать программистом.

Решение задачи: «Обработка текстового файла и запись в бинарный файл»

textual
Листинг программы
double min; int i, imin;
imin = i = 0; 
while (fread(&a,sizeof(a),1,fb))   {
   if (i==0) { min = a; imin = i; }
   else if (a<min) { min = a; imin=i; }
   i++;
}
// imin - стал = номеру миним.элемента
fseek(fb, (long)(imin+1)*sizeof(a), 0);  //  установились на элемент за минимальным
double s = 0;
while (fread(&a,sizeof(int),1,fb)) s += a;
cout << s;

Объяснение кода листинга программы

  1. Объявлены переменные: double min; int i, imin;
  2. Инициализированы переменные: min = 0; i = 0; imin = 0;
  3. Запущен цикл while, который выполняется до тех пор, пока fread(&a,sizeof(a),1,fb) возвращает значение true (что означает успешное чтение одного элемента из файла).
  4. Внутри цикла:
    • Если текущее значение i равно 0, то min = a (т.е. первый прочитанный элемент становится минимальным).
    • Если текущее значение a меньше min, то обновляются значения min и imin (т.е. текущий элемент становится новым минимальным).
    • Значение i увеличивается на 1.
  5. После окончания цикла, переменная imin содержит номер минимального элемента в файле.
  6. Используя fseek(fb, (long)(imin+1)*sizeof(a), 0), мы перемещаемся в файле на элемент, следующий за минимальным.
  7. Объявлена переменная double s = 0; (сумма).
  8. Запущен цикл while, который выполняется до тех пор, пока fread(&a,sizeof(int),1,fb) возвращает значение true.
  9. Внутри цикла:
    • Значение a добавляется к переменной s.
  10. После окончания цикла, выводится значение s.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы