Работа с текстовым файлом в C++ для начинающих

В первых моих попытках работы с текстовым файлом, у меня возникли определённые затруднения. В то время у меня ещё не было книг, которые обязательно нужно читать, поэтому искал всё в интернете. Мои поиски информации о работе с текстовым файлом не были на тот момент очень успешными. Какая-то дикая смесь языка С и языка С++ выдавалась на сайтах, открываемых мной. Хотя я не искал ничего сложного, просто хотел узнать, как записать в файл текст, вводимый с клавиатуры в консоль.
Начинающим программистам очень часто нужна простота. Ведь на простых примерах учиться проще. Начинается всё с получения минимальных навыков. Когда хоть что-то понимаешь, то и учиться на таком проще.
  • Чем проще написан наш код, тем проще и нам самим, и тем, кому с нашим кодом может прийтись возиться.
Нередко бывает так, что талантливые программисты отдают большее предпочтение простоте при написании кода, а не использованию в своих кодах сверхскоростных алгоритмов. Это происходит из-за того, что со временем код может нуждаться в поправке, а в простых кодах и исправлять всё легче.
Вариантов реализации записи текста в файл на С++ много. Даваемый способ вам мной — это только один из существующих.
  • Для работы с файлами нужно подключить заголовочный файл (директиву) fstream.h

Вообще, работа с текстовым файлом в языке С++ очень напоминает работу с обычным выводом текста на экран. Для вывода на экран мы используем встроенный в язык объект cout и операцию <<, а в случае работы с файлом мы будем использовать собственное имя объекта и применяемую к этому объекту операцию <<. После приведённого примера с записью в файл текста (ближе к концу статьи) вы скорее всего быстро поймёте единообразие вывода текста на монитор и вывода текста в файл.

  • Если файл с указанным именем существует до запуска программы, то после запуска программы всё, что хранил существующий файл, будет стёрто. Будьте внимательны!
Этот код позволит создать компилятору исполняемую программу, в ходе работы которой будет создан текстовый файл с именем myfile.txt. Одна из трудностей новичков — найти созданный файл. В том случае, если полный путь не указывается, файл создаётся там же, где лежит главный файл компилятора. У меня, например, главный файл компилятора Borland C++ 3.1 находится в папке C:\Borland\BORLANDC\BIN, там и создаётся файл "myfile.txt" Попробуйте или узнать, или вспомнить, куда ставили компилятор, найдите там папку BIN, с очень большой вероятностью созданный файл будет именно там.
Немного разберёмся с кодом.
out — это названный нами объект, выполняющий роль файла. Имя можно давать любое, не противоречащее правилам именования переменных.
ofstream — это тип объекта. (всё как с переменными: тип переменной, имя переменной). Этот тип, это специальный тип, позволяющий записывать в файл данные.

Т. е. мы объявили объект с названием out и задали ему такой тип, который даёт нам возможность работы с файлом, тип ofstream.

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

out.close(); — это мы прекращаем работу с файлом, как будто бы закрываем файл. Правило закрытия достаточно простое: Имя_объекта.закрыть(); Иногда можно забыть закрыть файл, а потом долго ломать голову, почему при решении какой-то задачи что-то работает не так. Поэтому первое время закрывайте. Иногда можно не закрывать, а просто переставлять курсор, бегающий по файлу, в начало файле, но в этой статье о такой перестановке курсора не будет написано.
  • Если вы создаёте файл вовнутрь каких-то папок, то все эти папки должны уже существовать, иначе файл создан не будет. Обратите на это внимание.
Наша программа умеет создавать файл. Это здорово. Наша программа создаёт пустой файл — это не здорово. Толку от пустых файлов мало.
Попробуем записать вовнутрь файла две строчки:
"Hello World"
"Ura, rabotaet!!!"
Для удобства создадим себе папку FromC на диске C:\
Только помните, что есть небольшая зависимость относительно корня системы, о которой я упоминал выше. Если вы работаете с эмулятором, то пути получаются немного другими.
В созданную папку будем записывать файл, в который и запишем текст, вводимый с клавиатуры.
  • Папку создайте вручную

Всегда учитывайте, что создаваемая таким образом программа не создаёт отдельных папок, а создаёт только непосредственно файл, что если папки нет, то и файл не будет создан.
Компилируем программу. В Borland C++ 3.1 или комбинацией клавиш Ctrl+F9, или задействование верхнего меню Run-Run. Смотрим в папку, если всё правильно было сделано, то внутри папки должен был появиться файл "myfile.txt", а в файле должно оказаться две наши строчки. Если вы используете свою среду для компиляции программ, то лучше меня должны знать, как у вас скомпилировать код и запустить программу.
В листинге #2 особое внимание обратите на то, что общее правило вывода куда-то подчиняется одним и тем же правилам, т. е. если бы выводили на экран текст, то использовали бы операцию <<, если бы выводили текст на принтер, то использовали бы операцию <<, если бы выводили текст в какое-то устройство, то использовали бы операцию << и т. д. Т. е. для любого вывода в С++ обычно используется операция <<, применяемая к имени объекта, обозначающего или файл, или устройство, а для ввода из чего-то в программу обычно используется операция >>. Различие только в типах, как бы любое устройство описывается определённым типом. В общем, вы можете в листинге #2 использовать вывод текста на экран с помощью cout<< и убедиться, насколько похож вывод текста на экран и вывод текста в файл. Хотя для подобных целей С++ позволяет использовать любую операцию, всем и всегда понятно, что использование << — вывод информации во что-то, а взятие информации откуда-то >>.
Имя файла не обязательно указывать сразу в круглых скобках. Можно делать по-другому:

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

23 комментария: Работа с текстовым файлом в C++ для начинающих

  • Edward говорит:

    Спасибо огромное за урок!!Ваш урок очень сильно мне помог)




    0



    1
  • Максим говорит:

    А не подскажите как прописать универсальный адрес для папки AppData?

    Автор сайта отвечает:
    Увы, не знаю




    0



    0
  • Vasia говорит:

    Говно это все.
    Херня, а не урок.




    2



    0
  • Алексей говорит:

    Добавьте – using namespace std;

    Автор сайта отвечает:
    Когда я все это писал, я использовал Borland C++ 3.1, там этой строчки не нужно.




    0



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

      Прошу прощения, уважаемый, но использование «using namespace std;» не разумно и бывает опасно в проектах. А ещё это говорит о не самом лучшем вкусе программиста.




      0



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

    У меня почему то все файлы создаются в папке самого проекта, путь указываю, бесполезно.Подскажите, может я что неправильно написала?

    Автор сайта отвечает:
    Можно попробовать с двойным слешем после буквы диска.
    C:\\MyFile.txt
    Есть вероятность, что диск C:\ защищен от записи на него чего-либо, тогда надо записывать не на C:\, а или на другой диск или в папку, которую предварительно надо сделать руками.




    0



    0
  • Alexsandr говорит:

    Подскажите, как считать информацию с нескольких файлов?
    Вот к примеру я записал один файл и считал с него 2 строки. Затем я захотел прочитать другой файл(уже существующий) и вывести его информацию на экран. Но выдает ошибку.

    Ошибки:
    [C++ Error] UnitText.cpp(24): E2238 Multiple declaration for 'in'
    [C++ Error] UnitText.cpp(19): E2344 Earlier declaration of 'in'

    Автор сайта отвечает:
    Здесь только один файл в коде обрабатывается.
    В глаза бросается открыли как out, а закрыли как in
    ofstream out —> out.close() , а не in.close()

    как буду дома, допишу примером как с двумя файлами, пока возможности нет

    Как-то он фальшива выдал мой код. Вообщем на повторный запрос чтения файл мой компил ругается. Подскажите как это исправить или что я делаю не правильно?

    Автор сайта отвечает:
    Visual Studio под рукой нет, поэтому немного в старом стиле.
    в Visual Studio лучше использовать string

    Мой пример больше подойдет к этой моей статье.

    Спасибо большое! Полезная информация для работы с вашими самостоятельными заданиями.




    0



    0
  • Сергей говорит:

    😎
    Самый толковый урок, находил другие, где код в 30 строк и с применением 100500 других библиотек, хотя мне нужно было лишь вывести данные. Огромное спасибо!




    0



    0
  • Sergio говорит:

    Возможно странный вопрос, но всё же спрошу (за спрос денег не берут и камнями не кидают :mrgreen: ).
    Так вот: возможно ли открыть файл в пределах ОДНОЙ функции, а закрыть его в пределах уже ДРУГОЙ функции?
    Что-то не могу сообразить как, но предчувствую, что это несложно…

    Автор сайта отвечает:
    сейчас занят немного, поэтому первое что в голову пришло: “Указатель должен указывать на файл. Только следить нужно будет. Указатель передаете между функциями и работаете с указателем как с файлом”
     
    Я посмотрел, теперь могу сказать точно.
    Если использовать ofstream (ifstream), понятия не имею как такое делать. Мне это не сложным (с моими текущими знаниями) не кажется.

    Печально… Похоже придется использовать что-то вроде fopen(), fwrite(), fread(), fclose() и т.п. Знать бы только как… 🙁
    P.S. спасибо и на этом, сократили мне хоть время поиска.

    Автор сайта отвечает:
    Сам принцип работы мало отличается.
    Язык Си проще чем С++, а в С++ есть ситуации когда без Си обойтись или невозможно или очень геморно.
    вот вам ссылка (там мне кажется понятно написано)
    Запись в файл на языке СИ

    Автор сайта отвечает:
    Оказывается в С++ легко делается. Только с какой целью вам потребовалось не знаю.
    вот, спрашивал на форуме как.




    0



    0
  • Татьяна говорит:

    Подскажите, как сравнить данные,которые взяты из файла txt на конкретные слова,символы?например -‘var’ или ‘int’. Пробовала сравнением не получается,нигде не могу найти.Нужно срочно,но изучаю с++ 2-ой день.Помогите пожалуйста.

    Автор сайта отвечает:
    Я это не очень хорошо знаю, но помню, что нужно сравнивать спец.функциями для работы со строками. Какие я сказать сейчас не могу. (просто времени нет).
    еще я помню, что проблемы могут быть с кодировками (как это с файлами не знаю, но при вводе символа со строки внутри исходника и при вводе такого же символа с клавиатуры символы имеют разные коды и сравнение у них не срабатывает, там приходится делать перевод к нужной кодировке).
    т.е. если считывается из фала и проверяется на то, что введено с клавиатуры – сова могут быть не равны только из-за того, что у их символов числовые коды разные, хотя сами слова одни и те же.
    _________________
    Эта тема, в которой я плохо ориентируюсь, а сейчас голова болит работой с программированием не связанной.
     
    хотя, не. это для русских символов с кодировкой тема. для англ. спец.функции сравнения строк есть.
    они в файле string.h определены (это если не тип string использовать, если тип string, то там работает и простое сравнение. тип string в новых компиляторах есть, в старых нет)




    0



    0
  • temka896 говорит:

    Здравствуйте. Дана такая задача:
    В иходном фале написаны характеристики автомобилей (имя, мощность, наибольшая скорость, масса, вид кузова, объем цилиндра и стоимость)(машин, например, 3, я сам в цикле задаю их количество). Нам надо вывести все это только для одной машины, с учетом того что скорость у нее больше остальных.
    Я пытался, для каждой из характеристик задасть массив, разделяя их только пробелами, после отсортировать, вышло безобразие какое-то, видимо свое все напридумывал.
    Вопрос: Что можете подсказать для решения этой задачи?

    Автор сайта отвечает:
    Массив структур. Запись не в текстовый, а в бинарный файл.




    0



    0
  • Dima говорит:

    Большое спасибо за урок!

    Получилось скомпилить код в линуксе с небольшими изменениями. Если кому интересно то такой код работает в линуксе

     

    #include <fstream>
    #include <iostream>
    using namespace std;
    int main()
    {
    ofstream out(«/home/dima/Develop/lp/tmp/config_test.ini»); //ofstream — это тип данных. Внутри скобок параметр, принимаемый конструктором объявленного объекта    out<<«HelloWorld<<«\n»; //Записываем первую строчку
    out<<«UraRabotaet!!!»; //Записываем вторую строчку
    out.close(); //Закрываем файл
    return 0;
    }




    0



    0
  • Дмитрий говорит:

    Этот код должен работать если его вставлять в готовую программу между заголовочными файлами и формой?

    Автор сайта отвечает:
    В Borland builder c++ скорее всего нужны небольшие поправки.

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

    Автор сайта отвечает
    Конкретно сейчас подсказать не могу. Я не дома и c++ под рукой нет. Могу утром (по Москве). Только какие переменные должны считываться и как они хранятся внутри файла?. В зависимости от этого ответ на вопрос может быть различен.

    Автор сайта отвечает:
    Наверное, вы уже нашли ответ и вам это теперь не нужно. Но может кому-то нужно. Так как я не дождался ответа на вопрос уточнений, то вот пример считывания double из файла с сохранением их в массив.

    Очень стандартный способ хранить сначала число переменных и потом сами переменные. От этого и оттолкнемся.

    Тут, конечно не вес ь проект, но основное все показал.
    Внутри файла только числа , первое количество чисел, второе числа а’ля переменные
    5
    12.333   6.89   -789
    12.33   43.567




    0



    0
  • Сергей говорит:

    Подскажите, к кому обратиться за помощью в написании программки на с++, краткий смысл — чтение числа из текстового файла, вывод его на лпт-порт, чтение числа с порта, запись в другой текстовый файл, подробнее в личке. Обращение к ЛПТ на с++ нашёл, а с чтением-записью не получается. Учить язык с++ времени нет, основная программа будет на другом языке, который с ЛПТ не дружит и считывать будет из текстовых файлов.




    0



    0
  • Данила говорит:

    Скажите пожалуйста, как в текстовый файл в определённую строку ввести текст (у меня 57 строк, а мне нужно в 26 или в какую-нибудь другую).




    0



    0
    • admin говорит:

      Допиливать надо. мне лень. Можно делать вообще по другому. Но так как условий мало, то берите, что даю.




      0



      0
  • Тима говорит:

    Добрый вечер, уважаемый автор -реально полезный туториал. У меня вопрос- если нужно считать информацию с одного текстового файла а затем сохранить в другой файл тот же самый текст, но уже разбитый на колонки длиною Х, где икс равен числу которое вводишь сразу после названия (расположения файла в командной строке).

    то есть вводишь имя файла и количество знаков (икс) и в новом файле появляются колонки со строками длиною икс. Плюс проблемка так же в том , что пробелы тоже учитываются как знаки

    Заранее спасибо,




    0



    0
    • admin говорит:

      Простое форматирование.

      Какой текст и в каких местах его разбивать на колонки мне откуда знать?




      0



      0
  • Данил говорит:

    Такой вопрос, а как сделать так, чтобы мы сами в переменую задали путь к файлу в который будем вносить данные?




    0



    0
    • admin говорит:

      Только нужно дополнительно проверки делать, если каталога не существует, то не запишет, поэтому либо записывать в уже существующий каталог, либо создавать каталог перед записью.




      0



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

    отличный материал для новичков




    0



    0
  • Сергей говорит:

    Отличная статья




    0



    0

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

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

Поиск

 
     

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

https://www.litres.ru/devid-herron/node-js-razrabotka-servernyh-veb-prilozheniy-na-javascript/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор

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

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