На этом шаге мы рассмотрим использование ранее приведенных функций при работе с
файлами.
Для форматного ввода или вывода в файл можно использовать функции:
fprintf (<указатель на файл>,<указатель на формат>,<аргументы>); fscanf (<указатель на файл>,<указатель на формат>,<аргументы>);
Они идентичны функциям printf() и scanf(), но только первый параметр - ссылка на файл.
#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; } }
#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; } }
#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); } }
#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); }
На следующем шаге мы разберем функции, реализующие низкоуровневый ввод/вывод.