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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2009, 21:04   #1
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию Обращение к нужной записи в файле

Доброго времени суток уважаемые эксперты. Наткнулся на такую проблемму: Записываю в файл структуры:
Код:
struct Student
{
	char FIO[30];
	unsigned int Year;
	char GroupNumber[10];
	int subject[4];
	double middleMark;
};
Запись/чтение работает идеально
Код:
		while (!feof(FData))
			{
				if(fread(&s,size,1,FData))
				{
					cout<<ftell(FData)<<endl;
					cout<<"#"<<numb+1;		
					WriteData(s,NULL);		
					AllStudent[numb++] = s;	
				}
        	      
			}
			fclose(FData);					
		}
Код:
		while ((c == 'y')||(c == 'Y'))
			{
				s = ReadData();				
				fwrite(&s,size,1,FData);
				cout<<"Bring data? y-Yes/n-No: ";	
					cin>>c;
			}
			fclose(FData);
до тех пор, пока я не начинаю обращаться к отдельным записям внутри файла:
Код:
if ((FData= fopen(wayToFileData, "r+,w+")) != NULL)
	{
	    int NumberRecord = 0;
	    cout<<"Enter number record: ";
	    cin>>NumberRecord;
	     if ((NumberRecord > 0) && ((NumberRecord) <= filelength(fileno(FData))/size))
	{	
		fseek(FData,(NumberRecord-1)*size,0);
		if (fread(&s,size,1,FData))
		{
	             WriteData(s,NULL);	
                        fseek(FData,(NumberRecord-1)*size+(NumberRecord-1),0);
		  s = ReadData();					
                        WriteData(s,FData);
   	            }
	}
	fclose(FData);
	}
Некоторые данные считваются нормально, некоторые со смещением в несколько байт...
Получается некрасивая каша))). Собственно вопрос: как это вылечить, и почему это происходит
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 19.10.2009, 22:05   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
fseek(FData,(NumberRecord-1)*size,0);
if (fread(&s,size,1,FData))
{
  WriteData(s,NULL);	
  fseek(FData,(NumberRecord-1)*size+(NumberRecord-1),0);
  s = ReadData();					
  WriteData(s,FData);
}
Интересно, а что тут происходит? Установил позицию - прочитал, потом записал, опять установил позицию, прочитал, записал... Это для чего такие махинации? Расскажи, что за параметры у WriteData, и для чего она нужна, а то совсем непонятно

(NumberRecord-1)*size+(NumberRecord-1) = (NumberRecord-1)*(size+1) - так ведь удобнее
counter вне форума Ответить с цитированием
Старый 19.10.2009, 22:45   #3
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Объясняю. WriteData - выводит данные на экран если указатель на файла = NULL, или пишет эти данные в файл если указатель не NULL. Теперь как это задумывалось. На экран выводятся все записи, затем пользователь вводит номер интересующей его записи. Запись с даннам номером читается из файла (для удобного просмотра), и пользователь получает возможность редактирования (по сути новая запись должна переписывать старую в файле). Вот для этого и устанавливается два раза указатель.
Надеюсь понятно объяснил))
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 19.10.2009, 23:08   #4
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

Код:
int NumberRecord = 0;
fseek(FData,(NumberRecord-1)*size,0);
эм... (0-1)*size = -size;
позиция чтения в файле не может быть минусовая.
lennon вне форума Ответить с цитированием
Старый 19.10.2009, 23:12   #5
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Это вырезка из кода! У меня стоит заглушка
Код:
if ((NumberRecord > 0) && ((NumberRecord) <= filelength(fileno(FData))/size))
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 19.10.2009, 23:22   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Надеюсь понятно объяснил))
угу!

так чтобы переписать данные в то место, откуда прочитал надо и указатель записи в тоже место т.е.

Код:
fseek(FData,(NumberRecord-1)*size,0);
if (fread(&s,size,1,FData))
{
  WriteData(s,NULL);	
  fseek(FData,(NumberRecord-1)*size,0);
  s = ReadData();					
  WriteData(s,FData);
}
counter вне форума Ответить с цитированием
Старый 19.10.2009, 23:32   #7
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
угу!

так чтобы переписать данные в то место, откуда прочитал надо и указатель записи в тоже место т.е.

Код:
fseek(FData,(NumberRecord-1)*size,0);
if (fread(&s,size,1,FData))
{
  WriteData(s,NULL);	
  fseek(FData,(NumberRecord-1)*size,0);
  s = ReadData();					
  WriteData(s,FData);
}
Упс... Прошу прощения. Это осталось с моих экспериментов Я делал именно так, как вы написали.
Такое ощущение, что в файл записываются данные разного размера...
Вот мои наблюдения:
1. sizeof(Student) - выдает размер 73 байта а не 68
2. Если записывать в файл одинаковые данные - размер записи соответствует 73 байтам. Если данные различаются - размер записи может увеличиваться до 74, 75 и т.д. (причем это предсказать невозможно).

Такое ощущение, что при записи fwrite пытается сжимать данные... Вот такая вот ерундень получается
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 19.10.2009, 23:52   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

а если вместо size писать sizeof(s) ?
counter вне форума Ответить с цитированием
Старый 20.10.2009, 16:07   #9
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

А смысл? Я перед этим делаю size = sizeof(Student). Тут дело не в запсиси/чтении, тут дело в представлении записей в файле...
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 20.10.2009, 16:29   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Impuls1989
Код:
if ((FData= fopen(wayToFileData, "r+,w+")) != NULL)
Раз пишите в файл структуру, то и сам файл, наверное надо открывать как бинарный? fopen(wayToFileData, "r+b");
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг нужной информации Lemo Помощь студентам 17 19.08.2009 02:37
Клик в нужной части экрана suvor111 JavaScript, Ajax 9 29.04.2009 19:57
Сохранять текст в нужной кодировке snake-as Microsoft Office Excel 5 28.10.2008 06:37
Проверка наличия нужной Флешки ??? Noor Общие вопросы Delphi 7 09.11.2007 17:39