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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2011, 21:47   #1
teach
 
Регистрация: 01.04.2011
Сообщений: 7
Восклицание С++. Обработка файлов

Задача: " Дан файл F, компоненты которого являются целыми числами. Получить файл G, образованный из файла F исключением повторных вхождений одного и того же числа".
Решил с использованием массивов - препод не принял. Требует решение с указателями файлов. А как это сделать - не представляю. Якобы нужно, чтобы размер файла в программе определялся и массивы не использовались. Помогите, пожалуйста!
Мой предыдущий код:
Код:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a;

int n,i,j,c,v;

FILE *f,*g;

  if((f = fopen("filef.txt","r")) == NULL)
  {
        printf("error");
        exit(1);
  }
  if((g = fopen("fileg.txt","w")) == NULL)
  {
        printf("error");
        exit(1);
  }
  n=0;
  while(!feof)
  {
        fscanf(f,"%d ",&v);
        n++;
  }
  a = (int*) calloc (n,sizeof(int));
  if (a == NULL) exit (1);
  fscanf(f,"%d ",&a[0]);
  fprintf(g,"%d ",&a[0]);
  for(i=1;i<n;i++)
        fscanf(f,"%d ",&a[i]);

  for (i = 0; i < n-1; i++)
  for (j = i+1; j < n; j++)
  if(a[i] > a[j])
  {
        c = a[i];
        a[i] = a[j];
        a[j] = c;
  }
  for (i = 1; i <= n ; i++)
     if(a[i] != a[i-1])
     fprintf(g,"%d ",a[i]);
  free(a);
fclose(f);
fclose(g);
}
teach вне форума Ответить с цитированием
Старый 01.04.2011, 23:39   #2
vasilisk-green
Пользователь
 
Аватар для vasilisk-green
 
Регистрация: 14.11.2009
Сообщений: 21
По умолчанию

Может быть так пойдет?
Код:
#include <stdio.h>
#include <stdlib.h>
//#include "populate.h"

int main()
{
	int i = 0, j = 0;
	FILE *f,*g;
	//populate();
	if((f = fopen("filef.txt","r")) == NULL)
	{
		printf("error");
		exit(1);
	}
	if((g = fopen("fileg.txt","w+")) == NULL)
	{
		printf("error");
		exit(1);
	}

	// Алгоритм: читаем из F очередное число, затем, если оно отсутствует в G - пишем его туда
	bool dup;	// duplicate
	while (!feof(f))
	{
		fscanf(f, "%d", &i);
		dup = false;
		fseek(g, 0, SEEK_SET);
		while (!feof(g))
		{
			fscanf(g, "%d", &j);
			if (i == j)
			{
				dup = true;
				break;
			}
		}
		if (!dup)
		{
			fprintf(g, "%d ", i);
		}
	}
	fclose(f);
	fclose(g);
}
vasilisk-green вне форума Ответить с цитированием
Старый 02.04.2011, 09:51   #3
teach
 
Регистрация: 01.04.2011
Сообщений: 7
По умолчанию

Спасибо большое, Vasilisk-green, попробовал. Но теперь программка совсем не создает файл G. Как быть? Кто может помочь?

Не могу разобраться в чем причина... Да, а что это за функция,
Код:
fseek(g, 0, SEEK_SET);
может она у меня просто не работает?
Теперь может уже и не читается из файла?

Последний раз редактировалось Stilet; 02.04.2011 в 12:08.
teach вне форума Ответить с цитированием
Старый 02.04.2011, 10:49   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Цитата:
Да, а что это за функция
Ф1 не работает, доки и справку съел вирус, гугл сдох... ?
p51x вне форума Ответить с цитированием
Старый 02.04.2011, 10:54   #5
teach
 
Регистрация: 01.04.2011
Сообщений: 7
По умолчанию

С функцией fseek разобрался, все понятно, но почему же не создается файл G? В чем же причина?

Разобрался с одной проблемой.
Теперь другая. Файл читается, но в файл G выводятся совсем посторонние числа.
Не могу разобраться в причине, помогите, пожалуйста!
Код:
#include <stdio.h>
#include <stdlib.h>
//#include "populate.h"

int main()
{
	int i = 0, j = 0; int dup, a;
	FILE *f,*g;
	//populate();
	if((f = fopen("f.txt","r")) == NULL)
	{
		printf("error");   scanf("%d", &a) ;
		exit(1);
	}
	if((g = fopen("g.txt","w+")) == NULL)
	{
		printf("error");
		exit(1);
	}

	// Алгоритм: читаем из F очередное число, затем, если оно отсутствует в G - пишем его туда
		// duplicate
	while (!feof(f))
	{
		fscanf(f, "%d ", &i);  printf("%d ", &i);
		dup = 0;
		fseek(g, 0, SEEK_SET);
		while (!feof(g))
		{
			fscanf(g, "%d", &j);
			if (i == j)
			{
				dup = 1;
				break;
			}
		}
		if (dup==0)
		{
			fprintf(g, "%d ", &i);
		}
	}
	fclose(f);
	fclose(g);
          scanf("%d", &a) ;
 return 0;
}
Ура!!! Заработало! Все удалось как только поменял имя переменной с i на a и убрал обнуление переменной в начале. Вот код, который работает правильно! ОГРОМНОЕ СПАСИБО, vasilisk-green!
Код:
#include <stdio.h>
#include <stdlib.h>


int main()
{
	int  j, dup, a;
	FILE *f,*g;
	if((f = fopen("f.txt","r")) == NULL)
	{
		printf("error");
		exit(1);
	}
	if((g = fopen("g.txt","w+")) == NULL)
	{
		printf("error");
		exit(1);
	}

	// Алгоритм: читаем из F очередное число, затем, если оно отсутствует в G - пишем его туда

	while (!feof(f))
	{       fscanf(f, "%d ", &a);  printf("%d ", a);
		dup = 0;   // duplicate
		fseek(g, 0, SEEK_SET);  //помещаем указатель в начало файла g
		while (!feof(g))
		{
			fscanf(g, "%d", &j);
			if (a == j)
			{
				dup = 1;
				break;
			}
		}
		if (dup==0)
		{
			fprintf(g, "%d ", a);
		}
         }
	fclose(f);
	fclose(g);

 return 0;
}
Все, тема закрыта!

Последний раз редактировалось Stilet; 02.04.2011 в 16:11.
teach вне форума Ответить с цитированием
Старый 02.04.2011, 16:41   #6
Ирина Сергеевна
Пользователь
 
Регистрация: 20.05.2009
Сообщений: 17
Радость

Всё просто: не нужно выводить в файл ссылку на i.
Код:
if (!dup)
{
	fprintf(g, "%d ", i);
}
The impossible is possible, if you really want..
Ирина Сергеевна вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка текстовых файлов Grey Stallion Помощь студентам 1 24.02.2011 14:01
Обработка файлов FauLL Общие вопросы C/C++ 1 23.06.2010 21:34
Обработка файлов. Morzik8 Помощь студентам 2 17.05.2010 20:05
Обработка файлов Си++ modulrev Помощь студентам 22 19.02.2009 18:53