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

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

Литературы C++ у меня дома нет, книжек C++ я не приобретал (хотя книги по идее должны давать ответы на все вопросы С++)

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

Вариантов реализации каких-то необходимых функций много, предлагаемый мной — это только один из тех, которые существуют

Итак, чтобы обработать текстовый файл — мы должны подключить директиву fstream.h

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

Пишем код, создающий текстовый файл:

Вот такая программа создаст нам файл myfile.txt в директории где установлен C++ (по умолчанию в папке BIN). Если файл существовал, то всё что на нём было записано сотрется — Так, что будьте аккуратнее.
В dosbox С++ 3.1 немного не так. Тоже файл создается, но там где создаются программы, у меня это C:\Borland\Program

out — Это поток вывода. Точнее объект, в который мы выводим информацию.
ofstream — Это тип переменной. (Тип объекта)
В скобках после этой команды указывается путь к файлу — Если мы указываем только имя файла, то наша программа будет пытаться открыть файл по адресу где расположен исполняемый файл. Если нам удобно использовать какой-то отдельный каталог, то можно написать например так:

В этом случае файл будет открыт и записан по адресу Диск E: в Папке NewKatalog под именем myfile.txt
out.close(); — Так мы закрываем открытый нами для обработки файл. Закрывать открытый файл ОБЯЗАТЕЛЬНО

Примечание — Чтобы проверить примерДля успешного создания файла в папке NewKatalog -Каталог NewKatalog на диске E:\ уже должен существовать

<Пример записи файла MyFile.txt по пути C:\WindowsTemp (Проверено в XP SP2)

Если у вас стоит, например, WinXP на диске C:\ и в переменных средах указана временная папка Temp с путем C:\WINDOWS\Temp — то такой пример должен сработать. В папке Temp должен появится пустой файл с именем myfile.txt

Проверить переменную среду в XP можно вызвав контекстное меню Моего компьютера —
Свойства — Дополнительно — Переменные среды. В нижнем окне прописаны пути.

C записью файла надеюсь мы разобрались и даже знаем теперь, как записать файл в отдельную директорию средствами C++

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

Давайте разбираться как записывать в файл информацию. У меня статья про текстовый файл — поэтому попробуем записать в файл myfile.txt 2 строчки:
HelloWorld
Ura!!! Rabotaet

Для удобства и привыкания создадим отдельную папку на диске C:\ — Назовем её FromC — туда и будем записывать создаваемый файл, в который, соответственно, запишем нужные строки, используя С++ .

Пишем код:

Не забывайте — что такая программа папок не создает, а создает только файл, и если папка не существует — файл не создастся.
Компилируем программу (Ctrl+F9 или Run-Run) — Смотрим в папку FromC — Если всё правильно сделали — то должен был появиться файл myfile.txt и в файле должно было появиться 2 строчки, которые хотели записать, используя С++.
Если вы используете DosBox, то опять же небольшое отличие от обычного. У меня нужно было создать папку FromC по пути C:\Borland
(это то где находится DosBox)

======================================
Здесь есть небольшой недостаток, я его оставляю, потому что одна моя очень значительная и наверняка очень распространенная ошибка описана дальше, в следующей статье
ЧИТАТЬ ПРОДОЛЖЕНИЕ

ПОХОЖИЕ ТЕМЫ

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

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

  • Edward говорит:

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

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

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

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

  • Vasia говорит:

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

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

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

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

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

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

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

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

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

  • 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

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

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

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

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

  • Sergio говорит:

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

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

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

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

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

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

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

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

  • temka896 говорит:

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

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

  • 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;
    }

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

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

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

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

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

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

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

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

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

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

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

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

    • admin говорит:

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

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

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

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

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

    • admin говорит:

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

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

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

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

    • admin говорит:

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

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

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

Поиск

 
     
Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Пришёл парень на собеседование. Дали ему тест на админа. Он его успешно прошёл и спросил: - А вы всем курьерам такие тесты даёте?

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

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