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