Файловый ввод-вывод в С++

      Комментарии к записи Файловый ввод-вывод в С++ отключены

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 7 мес. назад.

  • Автор
    Сообщения
  • #3676

    До этого мы уже затрагивали тему ввода-вывода, но раньше данные считывались с клавиатуры и выводились в консоль. Теперь мы поговорим о чтении данных с файлов и вывода в такие же файлы. Мы тут не будем говорить о работе со структурой FILE (как это делалось в языке Си), речь пойдет о файловых потоках:

    1. Стандартный поток ввода — stdin;
    2. Стандартный поток вывода — stdout;
    3. Стандартный поток ошибок, этакий error_log — stderr;

    Начнем с практики – программа считывающая из input.txt и записывающая в output.txt:

     #include <iostream>
     #include <cstdlib>
     #include <cstdio>
     // две новые библиотеки, нужны для работы freopen
     using namespace std;
     int d[1000000], n;
     /*
     переменные, инициализированные до функции main, 
     считаются глобальными т.е. изначально равны нулю и
     могут быть вызваны в любой части программы.
     Рекомендую создавать массивы глобальными всегда.
     */
     int sum (int l, int r) {
        int ans = 0;
        n = r - l + 1;
        for (int i = l, j = 1; i <= r; ++i, ++j)
         d[j] = i;
        for (int i = 1; i <= n; ++i)
         ans += d[i];
        return ans;
     }
     int main() {
         freopen ("input.txt", "r", stdin);
         freopen ("output.txt", "w", stdout);
    
         int a, b;
         cin >> a >> b;
         cout << sum (a, b) << "\n";
         for (int i = 1; i <= n; ++i)
          cout << d[i] << " ";
         return 0;
     }

    В этом примере работа с файлами идет через стандартные потоки ввода/вывода, но для того, чтобы перенаправить их в файл используется функция freopen. Константы "r" и "w" задают режимы работы с файлом. Всего есть 6 режимов:

    1) Считывание, или «r», от слова read. Используется для потока ввода. Для считывания файл должен существовать.
    2) Запись, или «w», от английского write. Используется для потока вывода. Если файла не существует, то он будет создан, иначе — перезаписан.
    3) Добавление, или «a», от слова append. Используется для вывода, отличается от «w» тем, что продолжает записывать в файл, а не очищает его.
    4,5,6) Те же моды, с разницей в том, что их можно использовать и для ввода, и для вывода. Вот сами моды «r+», «w+», «a+».

    Так же для считывания можно использовать функции ifstream и ofstream, которые находятся в библиотеке <fstream>.

    ifstream считывает с заданного файла. ofstream выводит в заданный файл.
    Теперь о том как их написать:
    ifstream название_функции_ввода (“название_файла_ввода”);
    ofstream название_функции_вывода (“название_файла_вывода”);

    Пример той же программы с использованием функций библиотеки fstream:

    #include <fstream>
     using namespace std;
     int d[1000000], n;
     int sum (int l, int r)
     {
        int ans = 0;
        n = r - l + 1;
        for (int i = l, j = 1; i <= r; ++i, ++j)
         d[j] = i;
        for (int i = 1; i <= n; ++i)
         ans += d[i];
        return ans;
     }
     int main()
     {
         ifstream read_file ("input.txt");
         ofstream write_file ("output.txt");
         /*
            для считывания с файла input.txt мы будем 
            использовать функцию read_file, 
            можете заменить ее на что-нибудь другое
         */
         int a, b;
         read_file >> a >> b;
         write_file << sum (a, b) << "\n";
         for (int i = 1; i <= n; ++i)
          write_file << d[i] << " ";
         return 0;
     }

    Стоит отметить, что ifstream использует режим «a», а ofstream – режим «w». Можно открыть сколько угодно файлов, главное дать уникальное имя для функций ввода.

    Для закрытия считывания или записи используйте функцию .close():

    имя_функции_ввода/вывода.close();

Для ответа в этой теме необходимо авторизоваться.