Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > [c]Работа с файлами, а также функция fseek


Автор: Mixasik 25.11.2008, 22:05
Добрый вечер, господа!
Код

#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) - когда неудачное чтение?

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

Автор: Mixasik 26.11.2008, 13:47
Цитата(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 - результат аналогичен :(

Автор: Mixasik 27.11.2008, 00:40
В общем закавырка в 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, 21:32
А вот и ошибка из цикла чтения выйдет в том случае, если из файла считается число -1

Автор: bsa 28.11.2008, 14:26

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

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

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

Что-то я не очень понял, а в чем собственно проблема? Вместо fgetw используй fread и все.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)