Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c]Работа с файлами, а также функция fseek, перезапись элемента в файле... 
V
    Опции темы
Mixasik
Дата 25.11.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 4.10.2006
Где: Волгоград

Репутация: нет
Всего: нет



Добрый вечер, господа!
Код

#include <stdio.h>;
#include <conio.h>;
main()
{
 int max, min, pr;
 FILE *f;
 clrscr();
 printf("Creating files, 777 - cancel\n");
 f = fopen("in.dat","wb+");
 scanf("%d",&pr);
 while (pr != 777)
 {
  putw(pr, f);
  scanf("%d", &pr);
 }
 rewind(f);
 min = getw(f);
 max = min;
 printf("Not modifed file\n");
 while (! feof(f))
 {
  pr = getw(f);
  printf(" %d ",pr);
  if (min > pr) min = pr;
  if (max < pr) max = pr;
 }
 pr = min * max;
 rewind(f);
 printf ("\nPr = %d", pr);
 printf("\nsizeof(int) = %d \n",sizeof(int));
 while (!feof(f))
 {
  min = getw(f);
  printf(" %d ",min);/*специально для того чтобы было видно что -1 выводятся постоянно*/
  if (min == 0)
  {
   fseek(f, -sizeof(int), SEEK_SET);
   putw(pr,f);
  }
 }
 printf("\n Modifide file\n");
 rewind(f);
 while (! feof(f))
 {
  pr = getw(f);
  printf(" %d ", pr);
 }
 fclose(f);
 getch();
}

В общем в начале происходит заполнение файла целыми числами, потом поиск минимума и максимума + вывод, потом нахождение произведения, потом замена нулевых на произведение и потом вывод измененного файла, но тут проблемы такие:
Как только введено 777 перестает добавлять но в конец файла пишет -1, далее при выводе -1 есть, далее при замене, как только встречается первый ноль постоянно выводит -1 и все зацикливается... Помогите пожалуйста - бьюсь уже третий день... Вот, что значит учиться по справке... И когда у одного решения много способов... Это не паскаль 
Как я понию -1 возвращает getw(f) - когда неудачное чтение?
PM MAIL ICQ   Вверх
bsa
Дата 26.11.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



эта операция некорректна:
Код
fseek(f, -sizeof(int), SEEK_SET);
Так как ты пытаешься переместиться на 4 байта перед началом файла, что несколько неразумно. Может нужно заменить SEEK_SET на SEEK_END? smile
PM   Вверх
Mixasik
Дата 26.11.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 4.10.2006
Где: Волгоград

Репутация: нет
Всего: нет



Цитата(bsa @ 26.11.2008,  12:02)
эта операция некорректна:
Код
fseek(f, -sizeof(int), SEEK_SET);
Так как ты пытаешься переместиться на 4 байта перед началом файла, что несколько неразумно. Может нужно заменить SEEK_SET на SEEK_END? smile

sizeof(int) в turbo с выдает 2 байта smile Спасибо попробую, но допустим я считал 1 элемент, т.о. указатель находится на позиции 2 байта, и чтобы мне заменить первый элемент я с текущей позиции двигаюсь назад на 2 байта, в случае если элемент первый позиция 0, то есть начало файла и переписываю эти 2 байта... Ведь при чтении указатель перемещается? Я попробывал поставь SEEK_END - результат аналогичен :(
PM MAIL ICQ   Вверх
Mixasik
Дата 27.11.2008, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 4.10.2006
Где: Волгоград

Репутация: нет
Всего: нет



В общем закавырка в feof и немного в fseek smile
Принцип работы с функцией feof() следующий:  необходимо дочитать до конца файла, а потом прочитать еще один или более символов/байт за пределами файла, и только после этого feof() поймет что файл всетаки кончился.
Может наконец то сейчас добью проблему smile
Код

#include <stdio.h>;
#include <conio.h>;
main()
{
 int max, min, pr;
 FILE *f;
 clrscr();
 printf("Creating files, 777 - cancel\n");
 f = fopen("in.dat","w+");
 scanf("%d",&pr);
 while (pr != 777)
 {
  putw(pr, f);
  scanf("%d", &pr);
 }
 rewind(f);
 min = getw(f);
 max = min;
 printf("Not modifed file\n");
 printf("%d",min);
 while ( (pr = getw(f)) != EOF)
 {
  printf(" %d ",pr);
  if (min > pr) min = pr;
  if (max < pr) max = pr;
 }
 pr = min * max;
 rewind(f);
 printf ("\nPr = %d", pr);
 printf("\nsizeof(int) = %d \n",sizeof(int));
 while ((min = getw(f)) != EOF)
 {
  if (min == 0)
  {
   fseek(f, -sizeof(int), SEEK_CUR);
   putw(pr,f);
   fseek(f,ftell(f),SEEK_SET);
  }
 }
 printf("\n Modifide file\n");
 rewind(f);
while ((pr = getw(f)) != EOF)
 {
  printf(" %d ", pr);
 }
 fclose(f);
 getch();
}

Вот полностью рабочий код, я и не думал, что это так просто и одновременно сложно, так вот
Код

while ((pr = getw(f)) != EOF)

Считывать надо вот так(Может и это не лучший способ поправьме меня, но он работает)
Код

   fseek(f, -sizeof(int), SEEK_CUR);
   putw(pr,f);
   fseek(f,ftell(f),SEEK_SET);

И самое интересно, что если после putw не вызвать снова fseek(хотя я проверял что позиция одинаковая и по логике fseek ненадо) то следующий элемент будет концом файла и ничего дальше не заменится... Так вот и все smile 
Всем спасибо!

Это сообщение отредактировал(а) Mixasik - 27.11.2008, 01:11
PM MAIL ICQ   Вверх
Mixasik
Дата 27.11.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 4.10.2006
Где: Волгоград

Репутация: нет
Всего: нет



А вот и ошибка из цикла чтения выйдет в том случае, если из файла считается число -1
PM MAIL ICQ   Вверх
bsa
Дата 28.11.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Если вопрос исчерпан, то пометь тему решенной

PM   Вверх
Mixasik
Дата 28.11.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 4.10.2006
Где: Волгоград

Репутация: нет
Всего: нет



Вопрос решен полностью, правда с одним допущением, что в файле не будет элементов раных -1 smile
PM MAIL ICQ   Вверх
bsa
Дата 1.12.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Mixasik @ 28.11.2008,  23:35)
Вопрос решен полностью, правда с одним допущением, что в файле не будет элементов раных -1 smile

Что-то я не очень понял, а в чем собственно проблема? Вместо fgetw используй fread и все.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.