Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2012, 19:48   #1
M9ICKO
 
Регистрация: 23.07.2012
Сообщений: 4
По умолчанию Файлы с произвольным доступом.

Столкнулся со следующем проблемой: при записи данных в файл произвольного доступа и при последующем чтении данных из него всегда последняя запись повторяется два раза.
Как только не крутил эту проблему, решения не нашел.
Чтобы не быть голословным, накидал небольшой пример:
Код:
#include <stdio.h>

struct number
{
	int data;
};

typedef struct number NUMBER;

void main()
{
	NUMBER numb;
	FILE *fPtr;

	fPtr = fopen("example.dat", "w");
	
	numb.data = 1;
	fwrite(&numb, sizeof(NUMBER), 1, fPtr);

	numb.data = 2;
	fwrite(&numb, sizeof(NUMBER), 1, fPtr);

	numb.data = 3;
	fwrite(&numb, sizeof(NUMBER), 1, fPtr);

	fclose(fPtr);

	fPtr = fopen("example.dat", "r");

	while (!feof(fPtr))
	{
		fread(&numb, sizeof(NUMBER), 1, fPtr);

		printf("%d\n", numb.data);
	}

	fclose(fPtr);

}
При запуске:
1
2
3
3

Объясните в чем дело, пожалуйста.

Последний раз редактировалось Stilet; 27.07.2012 в 19:57.
M9ICKO вне форума Ответить с цитированием
Старый 28.07.2012, 00:11   #2
derElektroBesen
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 24
По умолчанию

Небольшая модификация Вашей программы:
Код:
while (!feof(fPtr))
    {
        printf("Считано %d байт.\n", fread(&numb, sizeof(NUMBER), 1, fPtr));
        printf("Позиция в файле: %d\n", ftell(fPtr));
        printf("Результат: %d\n\n", numb.data);
    }
Результат:
Код:
Считано 1 байт.
Позиция в файле: 4
Результат: 1

Считано 1 байт.
Позиция в файле: 8
Результат: 2

Считано 1 байт.
Позиция в файле: 12
Результат: 3

Считано 0 байт.
Позиция в файле: 12
Результат: 3
Не понимаю причины, однако не срабатывает признак конца файла...
derElektroBesen вне форума Ответить с цитированием
Старый 28.07.2012, 00:24   #3
derElektroBesen
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 24
По умолчанию

Как вариант решения - могу предложить проверку на число считанных байт...
Тем не менее, причина мне все равно не понятна.
derElektroBesen вне форума Ответить с цитированием
Старый 28.07.2012, 02:50   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Могу ошибаться, но, насколько я помню, причина такого поведения в том, что флаг EOF выставляется уже после попытки чтения файла после конца. Я обычно использую примерно такое считывание:
Код:
for (int i; in >> i;) { ... }
Здесь используется то, что потоки умеют приводиться к bool и приводятся к false, если был установлен флаг EOF.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 28.07.2012, 06:15   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Что за:
Цитата:
Тем не менее, причина мне все равно не понятна.
Цитата:
Могу ошибаться, но, насколько я помню,
Открываем доку:
Цитата:
The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод файла с произвольным расширением m1zantrop БД в Delphi 6 24.05.2012 08:17
Создать файл с произвольным именем Aimet Паскаль, Turbo Pascal, PascalABC.NET 2 17.06.2011 11:35
Файлы с произвольным доступом в PHP ololo-schoolboy PHP 2 21.03.2011 17:57
Обход ячеек по спираль с произвольным центром. iness Помощь студентам 6 16.11.2009 10:09
Циклы с произвольным количеством шагов Walter Помощь студентам 11 09.11.2008 16:53