comp-science.narod.ru ==> Дидактические материалы по информатике ==> Файлы в C++
Файлом называют способ хранения информации на физическом устройстве. Файл это понятие, которое применимо ко всему от файла на диске до терминала.
В C++ отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку. Они позволяют работать с различными устройствами, такими, как диски, принтер, коммуникационные каналы и т.д. Эти устройства сильно отличаются друг от друга. Однако файловая система преобразует их в единое абстрактное логическое устройство, называемое потоком.
Текстовый поток это последовательность символов. При передаче символов из потока на экран, часть из них не выводится (например, символ возврата каретки, перевода строки).
Двоичный поток это последовательность байтов, которые однозначно соответствуют тому, что находится на внешнем устройстве.
Объявление файла
FILE *идентификатор;Пример
FILE *f;Открытие файла:
fopen(имя физического файла, режим доступа)
Режим доступа строка, указывающая режим открытия файла файла и тип файла
Типы файла: бинарный (b); текстовый (t)
Значение | Описание |
---|---|
r | Файл открывается только для чтения |
w | Файл открывается только для записи. Если соответствующий физический файл существует, он будет перезаписан |
a | Файл открывается для записи в конец (для дозаписи) или создается, если не существует |
r+ | Файл открывается для чтения и записи. |
w+ | Файл открывается для записи и чтения. Если соответствующий физический файл существует, он будет перезаписан |
a+ | Файл открывается для записи в конец (для дозаписи) или создается, если не существует |
f = fopen(s, "wb"); k = fopen("h:\ex.dat", "rb");
Запись в файл
fwrite(адрес записываемой величины, размер одного экземпляра, количество записываемых величин, имя логического файла);Например,
fwrite(&dat, sizeof(int), 1, f);
Чтение из файла
fread(адрес величины, размер одного экземпляра, количество считываемых величин, имя логического файла);Например,
fread(&dat, sizeof(int), 1, f);
Закрытие файла
fclose(имя логического файла);
Пример 1. Заполнить файл некоторым количеством целых случайных чисел.
/* Заполнить файл некоторым количеством целых случайных чисел. */ /* Dev-C++ */ #include <cstdlib> #include <iostream> using namespace std; int main() { FILE *f; int dat; srand(time(0)); int n=rand()%30 + 1; cout << "File name? "; char s[20]; cin.getline(s, 20); f=fopen(s, "wb"); for (int i=1; i<=n; i++) { dat = rand()%101 - 50; cout << dat << " "; fwrite(&dat, sizeof(int), 1, f); } cout << endl; fclose(f); system("PAUSE"); return EXIT_SUCCESS; }
Пример 2. Найти сумму и количество целых чисел, записанных в бинарный файл.
/* Найти сумму и количество целых чисел, записанных в бинарный файл. */ /* Dev-C++ */ #include <cstdlib> #include <iostream> using namespace std; int main() { FILE *f; int dat, n=0, sum=0; cout << "File name? "; char s[20]; cin.getline(s, 20); f=fopen(s, "rb"); while (fread(&dat, sizeof(int), 1, f)) {n++; cout << dat << " "; sum+=dat; } cout << endl; cout << "sum: " << sum << "; number: " << n << endl; fclose(f); system("PAUSE"); return EXIT_SUCCESS; }
Пример 3. Поместить в файл n записей, содержащих сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса.
/* Поместить в файл n записей, содержащих сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса. */ /* Dev-C++ */ #include <cstdlib> #include <iostream> using namespace std; struct krolik {char pol; int vozrast; double massa;}; int main() { FILE *f; krolik dat; int n; cout << "File name? "; char s[20]; cin.getline(s, 20); f=fopen(s, "wb"); cout << "How many rabbits? "; cin >> n; for (int i=1; i<=n; i++) { cout << "What sex " << i << "th rabbit? "; cin >> dat.pol; cout << "How old " << i << "th rabbit? "; cin >> dat.vozrast; cout << "What is the mass of the " << i << "th rabbit? "; cin >> dat.massa; fwrite(&dat, sizeof(krolik), 1, f); } fclose(f); system("PAUSE"); return EXIT_SUCCESS; }
Пример 3 (продолжение). В бинарном файле хранятся сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса. Найти наиболее старого кролика. Если таких несколько, то вывести информацию о том из них, масса которого больше.
/* В бинарном файле хранятся сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса. Найти наиболее старого кролика. Если таких несколько, то вывести информацию о том из них, масса которого больше. */ /* Dev-C++ */ #include <cstdlib> #include <iostream> using namespace std; struct krolik {char pol; int vozrast; double massa;}; int main() { FILE *f; krolik dat, max; int n; cout << "File name? "; char s[20]; cin.getline(s, 20); f=fopen(s, "rb"); fread(&dat, sizeof(krolik), 1, f); max=dat; while (fread(&dat, sizeof(krolik), 1, f)) {if (dat.vozrast>max.vozrast) max=dat; else if (dat.vozrast==max.vozrast&&dat.massa>max.massa) max=dat;} cout << "The oldest rabbit has a sex " << max.pol << ", age " << max.vozrast << " and mass " << max.massa << endl; system("PAUSE"); return EXIT_SUCCESS; }
1) Функции fgetc() и fputc() позволяют соттветственно осуществить ввод-вывод символа.
2) Функции fgets() и fputs() позволяют соттветственно осуществить ввод-вывод строки.
3) Функции fscanf() и fprintf() позволяют соттветственно осуществить форматированный ввод-вывод и аналогичный соответствующим функиям форматированного ввода-вывода, только делают это применительно к файлу.
Библиотека потокового ввода-вывода
fstream
Связь файла с потоком вывода
ofstream имя логического файла;
Связь файла с потоком ввода
ifstream имя логического файла;
Открытие файла
имя логического файла.open(имя физического файла);
Закрытие файла
имя логического файла.close();
Пример 4. Заполнить файл значениями функции y = x * cos x.
/* Заполнить файл значениями функции y = x * cos x. */ /* Dev-C++ */ #include <cstdlib> #include <iostream> #include <fstream> #include <cmath> using namespace std; double fun(double x); int main() {double a, b, h, x; char s[20]; cout << "Enter the beginning and end of the segment, step-tabulation: "; cin >> a >> b >> h; cout << "File name? "; cin >> s; ofstream f; f.open(s); for (x=a; x<=b; x+=h) {f.width(10); f << x; f.width(15); f << fun(x) << endl; } f.close(); system("PAUSE"); return EXIT_SUCCESS; } double fun(double x) { return x*cos(x); }
Пример 5. Файл содержит несколько строк, в каждой из которых записано единственное выражение вида a#b (без ошибок), где a, b - целочисленные величины, # - операция +, -, /, *. Вывести каждое из выражений и их значения.
/* Dev-C++ */ #include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main() { long a, b; char s[256], c; int i; cout << "File name? "; cin >> s; ifstream f; f.open(s); while (!f.eof()) { f.getline(s, 256); i=0; a=0; while (s[i]>='0'&&s[i]<='9') { a=a*10+s[i]-'0'; i++; } c=s[i++]; b=0; while (s[i]>='0'&&s[i]<='9') { b=b*10+s[i]-'0'; i++; } switch (c){ case '+': a+=b; break; case '-': a-=b; break; case '/': a/=b; break; case '*': a*=b; break;} cout << s << " = " << a << endl; } f.close(); system("PAUSE"); return EXIT_SUCCESS; }
Пример 6. В заданном файле целых чисел посчитать количество компонент, кратных 3.
/* В заданном файле целых чисел посчитать количество компонент, кратных 3. */ /* Dev-C++ */ #include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main() {int r,ch; ifstream f; f.open("CH_Z.TXT"); ch=0; for (;f.peek()!=EOF;) {f>>r; cout << r << " "; if (r%3==0) ch++ ; } f.close(); cout << endl << "Answer: " << ch; system("PAUSE"); return EXIT_SUCCESS; }
© Шестаков А.П., 2011