C++ Для начинающих. Вывести текст из файла на экран

Где-то должно быть описано уже, но искать тяжело. У начинающих может возникнуть вопрос: "Как вывести текст файла на экран". Дело не хитрое, но если начинающих принудительно заставляют использовать старые версии компиляторов, то тут могут возникнуть проблемы. Думаю, эта тема достаточно актуальна (была, когда я это писал).
Запись в файл русского текста сопровождается некоторой головной болью: иногда если открывать файл, в который программа записывала текст в текстовом режиме, вместо ожидаемого русскоязычного текста можно видеть абракадабру. Эта абракадабра следствие кодировок, используемых в операционной системе, и кодировок, используемых компилятором.
Чтобы избежать вашей и моей головной боли, я буду и записывать текст в файл программно, и читать текст из файла программно.
Выводить текст из файла на экран можно разными способами, можно читать файл как бинарный и выводить текст, а можно читать файл как текстовый, в таком случае требуются дополнительные расчёты и дополнительное время программе для проведения некоторых внеурочных преобразований. Пример чтения из текстового файла в бинарном режиме приводится в статье C++ для начинающих. Знакомство работы с бинарными файлами. В текстовом режиме можно использовать два подхода: или создать массив строк с заранее оговорённым большим числом строк, или сначала посчитать сколько строк присутствует в файле, потом на основании результата подсчёта строк создать массив или указатель на массив с указанным количеством строк, или в самом сложном случае, создать указатель на массив строк и при каждом новом чтении строки внутри файла довыделять память для новой строки. В этой статье будут показаны первые два варианта.
Самый простой способ — это читать файл посимвольно. В таком случае не нужно создавать никаких массивов. Недостаток этого способа в том, что если вам нужно обрабатывать строки, то этот способ малопригоден. Но если вам надо просто выводить текст из файла на экран, то этот способ вполне себе нормален:

Не забывайте, что каталог, в который записывается файл должен существовать. Если вы используете эмулятор DosBox для работы с Borland C++ 3.1, то диском C:\ считается папка, в которую вы устанавливали Borland C++ 3.1. У меня это C:\Borland\
Если вы используете современные компиляторы, то вам нужно исправить заголовочные файлы и дописать using namespace std, с путями у вас всё нормально. Применяемую мной очистку экрана нужно будет убрать, она необходима в старых компиляторах.
В коде мы создаём файл или переписываем существующий вводимыми нами значениями. При записи строк в текстовом режиме имеет смысл дописывать к каждой записываемой строке символ переноса строки, иначе у вас получится однострочный файл.
После проведения записи файла мы читаем файл, при этом для чтения файла мы используем символ. Этот наш символ бежит по файлу, он пробегает каждый символ, и каждый пробегаемый им символ мы выводим на экран тёпленьким. Все файлы всегда заканчиваются признаком конца файла, наподобие символа-признака конца строки у файлов есть свой признак окончания. Когда наш бегунок-символ бежит по файлу, рано или поздно он наступает на этот признак, этот признак мы используем для выхода из цикла: до тех пор пока символьная переменная не получит в своё значение признак конца файла, будет выполняться цикл while, на каждом новом выполнении которого на экран будет выводиться считанное в символьную переменную значение.
Простыми словами можно сказать, что каждый символ считывается в символьную переменную и сразу же выводится на экран.
Переходим к другому способу.
Я сокращу немного коды, оставив запись в текстовом режиме на вас. Надеюсь, это и на пользу пойдёт, и поможет вам быстрее понять и освоить остальное показываемое мной здесь.

Достаточно просто, не так ли? Но такой способ плох тем, что трудно угадывать сколько на самом деле строк может быть в файле. Можно создать большой массив, вся основная масса ячеек которого будет простаивать, или наоборот: создать слишком маленький, а окажется, что нужен больше. Здесь уже на помощь приходят дополнительные расчёты и указательная переменная.
  • Количество строк в файле обычно можно посчитать, прочитав файл и сосчитав в нём количество символов '\n'
Подсчитав количество встречаемых переносов, можно создать указательную переменную, ради которой выделить столько памяти, сколько хватит под все строки, хранимые файлом. Недостаток такого способа — два прохода по файлу, а плюс — память будет использоваться разумно: сколько надо, столько и используется.

Этот код хорош тем, что выделяется памяти скорее всего столько, сколько и нужно. Но этот код труден новичкам, потому что требует знаний, ориентированных на указатели и внимательности. После того как число символов '\n' сосчитано, нам известно число строк, для которых следует выделить память, но память надо выделять для ещё одной строки сверху, это нужно, чтобы при проходе файла в последнюю строку массива мог попасть признак конца файла, который может оказаться единственным в строке, иначе этот признак может записываться в незарезервированный программой участок памяти, а это ведёт к непрогнозируемому поведению программы.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

16 комментариев: C++ Для начинающих. Вывести текст из файла на экран

  • Cuthbert говорит:

    В строке char *FName="C:\MyFile.txt"; лучше написать char *FName="C://MyFile.txt";
    Например, в Dev C++ как в первом случае не компилирует.




    0



    0
  • Аноним говорит:

    const N=256; //Константный размер строки
    Это ну очень просто урощает. Если мне надо в строку куда большее число элементов, скажем миллиона 2, что тогда делать?

    Автор сайта отвечает:
    разумеется то, как я описывал, упрощенный вариант, потому как эти все материалы сайта для начинающих, которым трудно понимать разные выкрутасы крутых программистов.

    я не очень понимаю в чем проблема.

    считать не по строкам, а посимвольно или порционно
    или может вам пример нужен создания строки более чем в 2.000.000 символов?




    0



    0
  • Visual Studio говорит:

    а подскажите пожалуйста, как посимвольно выводить текст?

    Автор сайта отвечает:




    0



    0
  • Sergio говорит:

    Добрый день! Вопрос появился: а как считывать построчно информацию из файла в разные переменные?

    Тут по циклу считываем в один и тот же массив, а потом выводим. Хочется понять, как считать первую строчку из файла в один массив, вторую строчку — в другой массив и т.д… 😐

    таки пример изложенный в статье это бинарное дерево или двусвязный список?

    Автор сайта отвечает:
    1. Создать Массив строк любым удобным для вас способом, не обязательно описанным мной.
    2. Использовать посимвольный проход по файлу.
    3. Использовать функцию, которая будет принимать номер строки (этот номер является индексом для массива строк) и текущий номер символа по создаваемой строке (курсор для строки). Номер строки нужно увеличивать если в символ считается признак конца строки, а текущий номер символа (тот, что курсор) обнулять (обозначать им начало строки)
    3. Строка есть массив. Конечно, можете создать еще и сверху массивы, как переменные, и выполнить посимвольное копирование элементов из каждой строки в соответствующий массив, но это едва ли нужно.




    0



    0
  • Gen говорит:

    Все таки правильней будет
    const char *FName="C:\\MyFile.txt"; //Путь к файлу
    а так
    char *FName="C:\MyFile.txt"; //Путь к файлу
    кодеблок ругается.

    таки пример изложенный в статье это бинарное дерево или двусвязный список?

    Автор сайта отвечает:
    Я посмотрел у себя в CodeBlocks (компилятор minGW) ругается только на void main,
    но не на char *FName="C:\MyFile.txt"; //Путь к файлу




    0



    0
  • kollok говорит:

    а за что отвечает эта строчка:
    system("CLS");
    ?
    ато не совсем понял её здесь назначение

    таки пример изложенный в статье это бинарное дерево или двусвязный список?

    Автор сайта отвечает:
    В Borland C++ 3.1 экран при запуске программы сам не очищается.
    Эта строчка выполняет очистку экрана.
    Вполне возможно, что в вашем случае эта строчка просто лишняя и можно ее убрать.

    kollok говорит:
    Благодарю)




    0



    0
  • Иван Иванов говорит:

    Объявлять

    char *S = {""};

    а потом сразу считывать туда строку символов — весьма плохая затея! Память-то под строку не выделена! И куда указывает S? Берём оч-ч-чень длинную строчку и получаем крах программы. Компилятор, кстати, в этом случае не ругается. Ему глубоко фиолетово, была ли выделена память для указателя. Он куда-то указывает, вот туда и будет записана строка, даже если в этом "куда-то" записаны нужные для дальнейшей работы программы данные.

    Если уж объявили строку таким образом, то следует под неё выделить место:

    char *s = {""};

    s = new char [N];

    а при считывании следить, чтобы длина строки не превысила N.

    Для считывания безразмерных строк, имхо, удобнее использовать std::string.

    Автор сайта отвечает:
    я исправлю про char *S = {""}; как будет время и желание. замечание справедливое. я ошибся.
    насчет string тоже верно, но тут маленький нюанс, что можно и потруднее. вреда от этого быть не должно.




    0



    0
  • Аноним говорит:

    Очень познавательная статья, респект автору за проделанный труд!!!




    0



    0
  • Aleks говорит:

    Покажите как может выглядеть код, если потребуется работа с текстом. Например: поиск запятых, подсчет определенных знаков, вводимых пользователем, подсчет слов и т.п.




    0



    0
    • admin говорит:

      Нужны примеры ввода данных и вывода. Такое условие, какое оно у Вас, может трактоваться различными вариантами.




      0



      0
      • Aleks говорит:

        Спасибо за проявленный интерес.
        Задание такое- ввести текст в файл. Потом его вывести на экран. Далее предусмотреть работу с этим текстом, а именно поиск определенных букв или знаков. Подсчет определенных букв или знаков в этом тексте.
        Я так понимаю нужно после ввода текста написать наверное switch c кейсами и предложить пользователю варианты: 1. «подсчитать символы введите нужный символ/букву и нажмите 1″
        2.»подсчитать пробелы нажмите 2″, 3.»подсчитать слова нажмите 3», 4. «подсчитать предложения нажмите 4», 5. «найти и посчитать одинаковое слово, введите слово и нажмите 4». ну и т.п.




        0



        0
        • admin говорит:

          Подсчет определенных символов не стоит создания новой темы. Решение в лоб — посимвольное чтение файла.
          Подсчет сколько раз какой символ встречается в файле — мода. Она же (мода) может помочь с подсчетом определенных символов.
          Подсчет слов стоит создания новой темы, но у меня несколько тем по подсчету слов в строке. А файл — он как одна большая строка. Я сомневаюсь, что Вам сейчас требуется обработка слишком большого текстового файла.
          Подсчет одинаковых слов. Вот это может и стоит создания темы, но я лучше помогу доделать чем опишу. Так лучше будет делающему, потому что делающий сможет столкнуться с ошибками, которых я могу не предполагать.

          Это все упражнения, которые мы должны выполнять используя те знания, что у нас есть.
          Хотите, чтобы помог разобраться, я согласен помочь разобраться.
          Но я не согласен просто сделать готовое, хотя задача достаточно проста. (не из ряда сложных).




          0



          0
  • Домовенок говорит:

    Добрый день! Подскажите пожалуйста как вывести все вхождения имени в текст (имя + 5 символов до и 5 символов после него).




    0



    0
  • Наська говорит:

    Подскажите пожалуйста как можно сделать:

    Дана строка, содержащая пробелы. Найдите в ней самое длинное слово, выведите на экран это слово и его длину.

    Вход: одна строка, содержащая пробелы. Слова разделены ровно одним пробелом. Строка должна считываться методом getline (программа должна считывать только одну первую строку). Выход: самое длинное слово в строке и его длина.




    0



    0
  • Олег говорит:

    Как вывести строки из файла, в которых содержится заданное слово? Пока сделал так




    0



    0
    • admin говорит:

      Нужно читать построчно.
      Каждую считанную строку разбивать на массив слов.
      Делать обход массива, проверяя каждую его ячейку на нужное слово.
      Если слово в массиве встретится, то вывести массив, если не встретится, то ничего не выводить.




      0



      0

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

sanya: а я фортран знаю flamekeeper: настолько ли глубоко? sanya: глубоко. узнал после того как в универе препода на$$$ послал. каждый день программы писал на фортане в наказание sanya: только сейчас понимаю, что сделал это не зря)

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок