Задать вопрос

Проблема с работой с файлами Си

Товарищи! Есть просто очень большой вопрос:
В общем, задание "Разработать программу для заполнения двоичного файла целыми числами в интервале [-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;
}
  • Вопрос задан
  • 3515 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
eignatik
@eignatik Автор вопроса
Проблема решилась добавление fflush(f); после fwrite. Просто fwrite не переводил курсор в файле и из-за этого начинались проблемы при последующих манипуляциях с курсором. А fflush(); сразу скидывает буфер в файл и перемещает курсор. В общем, всё оказалось проще.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
я бы сделал так:

while (fread(&val, sizeof(int), 1, f) > 0) // EOF == -1
{
if (val == max)
{
ft= ftell(f);
fseek(f, ft-sizeof(int), SEEK_SET); // отмотали на int назад
fwrite(&nulVar, sizeof(int), 1, f); // записали - теперь мы там же, где до ифа
}
Ответ написан
1. Вам отступы расставлять религия не позволяет?
2. У меня программа нормально работает и я не вижу причин почему не должна. Попробуйте проверить что возвращают fseek, ftell и fwrite, теоретически они тоже могут закончиться с ошибкой.
3. Если код на C, то пишите на C, зачем вы подключаете C++ заголовки?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы