Шаг 71.
Форматный ввод/вывод

    На этом шаге мы рассмотрим использование ранее приведенных функций при работе с файлами.

    Для форматного ввода или вывода в файл можно использовать функции:

   fprintf (<указатель на файл>,<указатель на формат>,<аргументы>);
   fscanf  (<указатель на файл>,<указатель на формат>,<аргументы>);

    Они идентичны функциям printf() и scanf(), но только первый параметр - ссылка на файл.


    Пример 1. Дан файл f, компоненты которого являются целыми числами: a) найти количество четных чисел среди компонент; b) найти количество удвоенных нечетных чисел среди компонент; c) найти количество квадратов нечетных чисел среди компонент (имя файла задается в командной строке).
#include <iostream.h>
#include <stdio.h>
void main (int argc,char *argv[])
{
      FILE       *in;
      int  t,i,k,p,m;
      /* ----------- */
      k = p = m = 0;
      if  (argc < 2)
         cout << "Имя файла не задано в командной строке.";
      else
      {
         in = fopen (argv[1],"w+");
         cout << "Вводите компоненты файла. Окончание ввода - число  -1\n";
         do
         {
            cin >> t; fprintf (in,"%d\n",t);
         }
         while (t!=EOF);
         fseek (in,0,SEEK_SET);//Перемещение указателя в начало файла.
         /* Вывод. */
         cout << "Контрольный вывод файла:\n";
         fscanf (in,"%d",&t);
         while (t!=EOF)
         {
            cout << t << endl; fscanf (in,"%d",&t);
         }
         fseek (in,0,SEEK_SET);//Перемещение указателя в начало файла.
         //Решение задачи.
         fscanf (in,"%d\n",&t);
         while (t!=EOF)
         {
            if  (t%2==0)
            {
               k++;
               if  (t%4!=0)
                  p++;
            }
            else
               for (i=1; i<=t/2+1; i++)
                  if  (t==i*i)
                  {
                     m++; break;
                  }
            fscanf (in,"%d\n",&t);
         }
         fclose (in);
         cout << "*****************************************\n";
         cout << "Количество четных чисел            : " << k << endl;
         cout << "Количество удвоенных нечетных чисел: " << p << endl;
         cout << "Количество квадратов нечетных чисел: " << m << endl;
      }
}
Текст этой программы можно взять здесь.


    Пример 2. Дан файл, содержащий целые числа. Найти наибольшее из них.
#include <iostream.h>
#include <stdio.h>
void main (int argc,char *argv[])
{
      FILE *f;
      int k,l;
      /* ------ */
      if  (argc < 2)
         cout << "Имя файла не задано в командной строке.";
      else
      {
         cout << "Файл: \n"; f = fopen (argv[1],"w+");
         do
         {
            cin >> k; fprintf (f,"%d\n",k);
         }
         while  (k!=EOF);
         fseek (in,0,SEEK_SET);//Перемещение указателя в начало файла.
         //Решение задачи.
         fscanf (f,"%d\n",&l);
         do
         {
            fscanf (f,"%d\n",&k);
            if  (k>l)
               l = k;
         }
         while  (k!=EOF);
         fclose (f);
         cout << "Максимальное значение = " << l << endl;
      }
}
Текст этой программы можно взять здесь.


    Пример 3. Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа файла f, а в файл h все нечетные. Порядок следования чисел сохранить.
#include <iostream.h>
#include <stdio.h>
void main (int argc,char *argv[])
{
   FILE *f,*g,*h;
   int k;
   /* ------ */
   if  (argc<4)
	cout << "Не все имена файлов заданы в командной строке.";
   else
    {
	cout << "Файл:\n";
	f = fopen (argv[1],"w+");
	cin >> k;
	while (k!=-1)
	{
	 fprintf (f,"%d\n",k);
	 cin >> k;
	}
	fseek (f,0,SEEK_SET);//Перемещение указателя в начало первого файла.
	//Решение задачи.
	//Создание второго и третьего файлов.
	g = fopen (argv[2],"w+");
	h = fopen (argv[3],"w+");
	int n_g = 0,n_h = 0;
	while (fscanf (f,"%d\n",&k)!=EOF)
           if  (k%2==0)
		{ fprintf (g,"%d\n",k); n_g=1; }
	   else
		{ fprintf (h,"%d\n",k); n_h=1; }
	fclose (f);
	rewind(g);//Перемещение указателя в начало второго файла.
	rewind(h);//Перемещение указателя в начало третьего файла.
	cout << "Содержимое файла g: " << endl;
	if (n_g)
	{
	  while (fscanf(g,"%d\n",&k)!=EOF)
	  {
	    cout << k << " ";
	  }
	  cout << endl;
	}
	else
	 cout << "файл пуст." << endl;
	fclose (g);
	cout << "Содержимое файла h: " << endl;
	if (n_h)
	{
	  while (fscanf (h,"%d\n",&k)!=EOF)
	  {
	    cout << k << " ";
	  }
	  cout << endl;
	}
	else
	 cout << "файл пуст." << endl;
	fclose (h);
    }
}
Текст этой программы можно взять здесь.


    Пример 4. Дан файл f, компоненты которого являются целыми числами. Получить в файле g компоненты файла f являющиеся четными числами, делящимися на 3 и не делящимися на 7.
#include <iostream.h>
#include <stdio.h>
void main ()
{
        FILE *f,*g;
        int k;
        char s[15];
        /* ------- */
        cout << "Задайте имя исходного файла: ";
        cin >> s;
        f = fopen (s,"w+");
        cout << "Содержимое файла \" << s << "\"\n";
	cin >> k;
	while (k!=-1)
	{
	 fprintf (f,"%d\n",k);
	 cin >> k;
	}
	rewind(f);//Перемещение указателя в начало первого файла.
	//Решение задачи.
        g = fopen ("g.dat","w+");
	int n_g = 0;
	while (fscanf (f,"%d\n",&k)!=EOF)
           if  ((k%2==0) && (k%3==0) && (k%7!=0))
		{ fprintf (g,"%d\n",k); n_g=1; }
	fclose (f);
	rewind(g);//Перемещение указателя в начало второго файла.
        cout << "Содержимое файла g.dat:\n";
	if (n_g)
	{
	  while (fscanf(g,"%d\n",&k)!=EOF)
	    cout << k << " ";
	  cout << endl;
	}
	else
	 cout << "файл пуст." << endl;
	fclose (g);
}
Текст этой программы можно взять здесь.

    На следующем шаге мы разберем функции, реализующие низкоуровневый ввод/вывод.


Предыдущий шаг Содержание Следующий шаг