Примеры использования средств C++ для работы с файлами
В теме приводятся примеры использования файловой системы C++ для:
- чтения информации из файлов;
- записи информации в файлы.
Содержание
- 1. Функция, читающая строки из клавиатуры и записывающая их в файл
- 2. Функция, которая читает текстовый файл и выводит его содержимое на экран
- 3. Пример бесформатного ввода/вывода. Копирование одного файла в другой
- 4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()
- 5. Пример функции записывающей структурную переменную в файл
- 6. Пример чтения структурной переменной из файла
- 7. Пример чтения/записи массива структур в файл. Функции write(), read()
- 8. Пример записи/чтения массива чисел типа double
- 9. Пример чтения из файла строк. Функция getline()
- 10. Пример чтения строк из файла. Функции getline() + eof()
- Связанные темы
Поиск на других ресурсах:
1. Функция, читающая строки из клавиатуры и записывающая их в файл
#include <iostream> #include <fstream> using namespace std; // Функция читает строки из клавиатуры и записывает их в файл void Example1(const char* filename) { ofstream os(filename); // текстовый файл для вывода // проверка, открыт ли файл if (!os) { cout << "Cannot open the file to output. \n"; return; } char str[80]; cout << "Save the lines to HDD. Enter ! to stop." << endl; do { cout << ":"; // чтение строки с использоанием пробелов между словами cin.getline(str, 80); os << str << endl; // записать в файл строку str } while (*str != '!'); // конец ввода строк - ! os.close(); // закрыть файл return; } void main() { Example1("myfile.txt"); }
После вызова функции Example1() будет создан файл «myfile.txt», в котором будут записаны строки, введенные с клавиатуры.
Результат работи программы:
Save the lines to HDD. Enter ! to stop. :Hello world! :bestprog.net :Working with files in C++ :!
⇑
2. Функция, которая читает текстовый файл и выводит его содержимое на экран
Функция Example2() читает содержимое файла filename, имя которого есть входящим параметром функции.
#include <iostream> #include <fstream> using namespace std; // Функция, которая читает файл filename и выводит его на экран // Используется класс ifstream для чтения файла bool Example2(const char * filename) { // создать экземпляр класса ifstream is(filename); // открыть файл в конструкторе // если файл не открыт, то выход с кодом false if (!is) return false; // чтение строк в цикле while char str[100]; // буфер для чтения одной строки while (is) // если is ненулевое, то еще не конец файла { is.getline(str, 100); // прочитать строку из файла в буфер str cout << str << endl; // вывести на екран } is.close(); // закрыть файл return true; } void main() { Example2("myfile.txt"); }
Результат работи программы отображает содержимое файла «myfile.txt», созданного в п.1 этой темы
Hello world! bestprog.net Working with files in C++ !
⇑
3. Пример бесформатного ввода/вывода. Копирование одного файла в другой
В примере реализована функция Example3(), которая выполняет копирование файлов в двоичном (бинарном) формате. Функция получает два параметра. Первый параметр типа const char* есть имя файла-источника. Второй параметр типа const char* есть имя файла-назначения.
Функция реализует посимвольное копирование. Для получения символа из файла-источника используется функция get().
#include <iostream> #include <fstream> using namespace std; // Бесформатный ввод/вывод, копирование одного файла в другой // Функция читает файл readFile и записывает его в файл writeFile // использует функцию get() для чтения bool Example3(const char * readFile, const char * writeFile) { // создать экземпляры классов ifstream, ofstream ifstream rf(readFile, ios::in | ios::binary); // файл-источник (чтение) // проверка, открыт ли файл-источник if (!rf) { cout << "Cannot open source file." << endl; return false; } // файл-назначение (запись) ofstream wf(writeFile, ios::out | ios::binary); // проверка, открыт ли файл-назначение if (!wf) { rf.close(); // закрыть файл-источник cout << "Cannot open the files." << endl; return false; } char sym; // цикл посимвольного чтения while (rf) { rf.get(sym); // считать из rf => sym if (rf) wf << sym; // записать sym => wf } cout << "Copy result: OK!" << endl; rf.close(); // закрыть оба файла wf.close(); }
Вызов функции Example3() из функции main() может быть следующим:
void main() { Example3("myfile.txt", "myfile2.txt"); }
После выполнения функции Example3() будет создан файл «myfile2.txt», который будет копией файла «myfile.txt».
⇑
4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()
Функция Example4() из данного примера работает также как и предыдущая, только вместо вывода в поток << используется функция put(). Также, с помощью функции is_open() выполняется проверка на корректность открытия файла.
#include <iostream> #include <fstream> using namespace std; // То же, что и Example3(), только для записи использует функцию put() bool Example4(const char * readFile, const char * writeFile) { ifstream rf(readFile, ios::in | ios::binary); // проверка, открыт ли файл if (!rf.is_open()) return false; ofstream wf(writeFile, ios::out | ios::binary); // проверка, открыт ли файл if (!wf.is_open()) { rf.close(); // закрыть ранее открытый файл rf return false; } char sym; // цикл посимвольного чтения while (rf) { rf.get(sym); // считать из rf => sym if (rf) wf.put(sym); // записать sym => wf } rf.close(); // закрыть оба файла wf.close(); } void main() { Example4("myfile.txt", "myfile2.txt"); }
⇑
5. Пример функции записывающей структурную переменную в файл
По данному примеру можно реализовывать собственные функции, которые будут записывать структуры или классы в файл.
Реализована функция Example5(), которая выполняет запись структурной переменной типа BOOK в файл, имя которого есть входящим параметром. Функция Example5() использует функцию write() для записи. Файл открывается в двоичном формате (ios::binary).
#include <iostream> #include <fstream> #include <string.h> using namespace std; // Функция, которая записывает структуру типа BOOK в файл, // использует функцию write() struct BOOK { char title[100]; // название книги char author[70]; // автор int year; // год выпуска float price; // стоимость книги }; bool Example5(const char * filename) { // создать структуру BOOK B; strcpy_s(B.title, "Title of book"); strcpy_s(B.author, "Authof of book"); B.year = 2000; B.price = 12.65f; // создать экземпляр файла в двоичном формате (ios::binary) ofstream outFile(filename, ios::out | ios::binary); if (!outFile) return false; // запись структурной переменной B в файл outFile.write((char*)&B, sizeof(BOOK)); outFile.close(); // закрыть файл return true; } void main() { Example5("myfile3.txt"); }
⇑
6. Пример чтения структурной переменной из файла
Данный пример есть продолжением предыдущего примера из пункта 5. В примере в функции Example6() заполняется значение структурной переменной типа BOOK. Полученное значение формируется как входящий параметр-ссылка на тип BOOK. Также функция получает параметром имя файла для чтения. Для чтения структурной переменной используется функция read().
#include <iostream> #include <fstream> #include <string.h> using namespace std; // чтение структуры типа BOOK из файла filename // используется функция read bool Example6(const char * filename, BOOK& B) { ifstream inFile(filename, ios::in | ios::binary); if (!inFile) return false; // получить структурную переменную B из файла inFile.read((char *)&B, sizeof(BOOK)); inFile.close(); return true; } void main() { BOOK B; // чтение из файла і запись в структурную переменную B Example5("myfile3.txt"); // запись в файл Example6("myfile3.txt", B); // чтение из файла // вывести содержимое переменной B cout << "B.title = " << B.title << endl; cout << "B.author = " << B.author << endl; cout << "B.price = " << B.price << endl; cout << "B.year = " << B.year << endl; }
Результат работы программы
B.title = Title of book B.author = Authof of book B.price = 12.65 B.year = 2000
⇑
7. Пример чтения/записи массива структур в файл. Функции write(), read()
В примере используются функции write(), read() для работы со структурой типа BOOK, а именно:
- записи массива типа BOOK в файл, который состоит из трех структурных переменных;
- чтения массива структур типа BOOK из файла.
#include <iostream> #include <fstream> #include <string> using namespace std; // Структура BOOK struct BOOK { char title[100]; // название книги char author[70]; // автор int year; // год выпуска float price; // стоимость книги }; // Запись массива структур в файл с помощью функции write() // Чтение массива структур из файла с помощью функции read() bool Example7(const char * filename) { // демонстрируется запись в файл и чтение из этого файла массива структур типа BOOK // создать массив структур BOOK B[3] = { { "Title-01", "Author-01", 2005, 100.95 }, { "Title-02", "Author-02", 2008, 90.25 }, { "Title-03", "Author-03", 2002, 180.50 } }; int n = 3; // количество элементов в массиве B BOOK C[3]; // другой масив, в который будет осуществлено чтение int n2; // количество элементов в массиве C int i; // 1. Запись массива структур в файл // outF - экземпляр файла, в который реализуется запись ofstream outF(filename, ios::out | ios::binary); if (!outF) return false; // записать значение n outF.write((char*)&n, sizeof(int)); // запись массива B[] в файл wf for (i = 0; i < n; i++) outF.write((char*)&(B[i]), sizeof(BOOK)); cout << "Array is written\n" << endl; // после завершения работы с файлом его нужно закрыть (обязательно) outF.close(); // 2. Чтение массива структур из файла // inF - экземпляр файла, из которого происходит чтение ifstream inF(filename, ios::in | ios::binary); if (!inF) return false; cout << "Read the array...\n"; // Сначала прочитать количество записанных структур inF.read((char*)&n2, sizeof(int)); // цикл чтения массива структур в переменную C for (i = 0; i < n2; i++) inF.read((char*)&(C[i]), sizeof(BOOK)); inF.close(); // закрыть файл // вывод массива C на экран cout << "Array C:" << endl; for (i = 0; i < n2; i++) { cout << "Title = " << C[i].title << ", "; cout << "Author = " << C[i].author << ", "; cout << "Year = " << C[i].year << ", "; cout << "Price = " << C[i].price << endl; } } void main() { Example7("file7.bin"); }
Результат работы программы
Array is written Read the array... Array C: Title = Title-01, Author = Author-01, Year = 2005, Price = 100.95 Title = Title-02, Author = Author-02, Year = 2008, Price = 90.25 Title = Title-03, Author = Author-03, Year = 2002, Price = 180.5
⇑
8. Пример записи/чтения массива чисел типа double
Демонстрируется:
- запись в файл массива M чисел типа double функцией write();
- чтение из файла массива чисел типу double функцией read().
Файл открывается в двоичном формате.
#include <iostream>> #include <fstream> using namespace std; // использование функций read(), write() для записи/чтения массива чисел bool Example8(const char * filename) { double M[] = { 2.44, 3.85, -3.23, 11.85, 3.38 }; // массив чисел int i; int n = 5; // количество элементов в массиве M // 1. Запись массива в файл // 1.1. Создать экземпляр outF, связанный с файлом filename ofstream outF(filename, ios::out | ios::binary); // для записи, двоичный формат // 1.2. Проверка открытия файла if (!outF) { cout << "Error. Cannot open the file."; return false; } // 1.3. Записать количество элементов в массиве M outF.write((char*)&n, sizeof(int)); // 1.4. Записать весь массив в файл outF.write((char*)&M, sizeof(double)*n); outF.close(); // закрыть файл // 2. Чтение данных из файла filename в массив M2 double M2[5]; int n2; // 2.1. Открыть файл для чтения ifstream inF(filename, ios::in | ios::binary); // 2.2. Проверка, открыт ли файл? if (!inF) { cout << "Error. Cannot open file."; return false; } // 2.3. Прочитать количество элементов в массиве inF.read((char*)&n2, sizeof(int)); // 2.4. Считать данные из файла в массив M2 inF.read((char*)&M2, sizeof(double)*n2); inF.close(); // закрыть файл // 2.5. Вывести массив M2 на экран cout << "Array M2:\n"; for (i = 0; i < n2; i++) cout << M2[i] << " "; cout << endl; return true; } void main() { Example8("file8.bin"); }
Результат работи программы:
Array M2: 2.44 3.85 -3.23 11.85 3.38
⇑
9. Пример чтения из файла строк. Функция getline()
В функции Example9() реализуется построчное чтение из файла с помощью функции getline(). Имя файла задается входящим параметром filename. Строки в файле состоят из набора слов, разделенных символом «пробел».
#include <iostream> #include <fstream> using namespace std; // Чтение из файла. Функция getline() bool Example9(const char* filename) { ifstream inputFile(filename); char buffer[255]; // буфер для сохранения одной строки if (!inputFile) { cout << "Error. Cannot open file"; return false; } // цикл чтения строк из файла while (inputFile) { inputFile.getline(buffer, 255); if (inputFile) cout << buffer << endl; // вывод прочитанной строки на экран } inputFile.close(); return true; }
⇑
10. Пример чтения строк из файла. Функции getline() + eof()
В примере реализована функция Example10(), которая выполняет чтение строк из файла. Файл открывается в текстовом формате. Имя файла задается входящим параметром функции. Определение конца файла выполняется с помощью функции eof().
#include <iostream> #include <fstream> using namespace std; // чтение из файла. Функции getline()+eof() bool Example10(const char* filename) { // создать экземпляр файла filename ifstream inputFile(filename, ios::in); if (!inputFile) return false; char buffer[255]; // буфер для сохранения одной строки // цикл чтения строк файла // строки читаются до тех пор, пока не будет достигнут конец файла while (!inputFile.eof()) { inputFile.getline(buffer, 255); if (inputFile) cout << buffer << endl; } inputFile.close(); }
⇑
Связанные темы
⇑