Товарищи! Есть просто очень большой вопрос:
В общем, задание "Разработать программу для заполнения двоичного файла целыми числами в интервале [-150; 150]. Количество компонент файла вводится с клавиатуры. Обнулить компоненты файла (прямо в файле) с максимальным значением (таких может быть несколько)." Написал, но почему-то, когда хочу заменить числа совпадающие с максимумом цикл уходит в бесконечность. Продолжает читать файл, причем сначала и пишет его, добавляя все новые порции, а EOF никогда не достигает (поставил комментарий возле проблемного места). Самое интересное, что как я не парюсь, всегда либо при сравнении он перепрыгнет через число, либо наоборот зациклится. В общем, ломаю голову уже долго... Буду очень признателен, если поможете разобраться, что за злопакость творится :)
p.s: может, это какие-то особенности режима доступа к файлу, о которых я не знаю?
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <iostream>
using namespace std;
int main()
{
FILE *f;
int i, size, max, iMax, val, maxIndex, datVar;
setlocale(LC_CTYPE, "Russian");
srand(time(NULL));
for (;;){
cout << "Введите количество компонент: ";
scanf("%d", &size);
if (size>0) break;
else cout << "Неправильное количество компонент. Повторите ввод: ";
}
f = fopen("file1.bin", "wb");
for (i = 0; i < size; i++){ //запись в файл рандомных чисел
datVar = rand() % 5;
fwrite(&datVar, sizeof(int), 1, f);
cout << datVar << " ";
}
cout << "\n";
fclose(f);
f = fopen("file1.bin", "r+b");
fseek(f, 0, SEEK_SET);
fread(&val, sizeof(int), 1, f); //считываем в файле int'ы
max = val;
while (fread(&val, sizeof(int), 1, f)!=0){
if (val >= max) {
max = val;
}
}
int nulVar = 0;
int ft = 0;
fseek(f, 0, SEEK_END);
int sizeF = ftell(f);
fseek(f, 0, SEEK_SET);
while (fread(&val, sizeof(int), 1, f) > 0)
{
if (val == max)
{
fseek(f, ftell(f) - sizeof(int), SEEK_SET);
fwrite(&nulVar, sizeof(int), 1, f);
fflush(f);//ВОТ РЕШЕНИЕ
}
if (ftell(f) == sizeF) break;
}
fseek(f, 0, SEEK_SET);
while (fread(&val, sizeof(int), 1, f) > 0)printf("%d ", val);
fclose(f);
cout << "\n";
system("pause");
return 1;
}