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

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

Записывать информацию в текстовый файл мы уже научились. — Если не научились смотрите прошлую статью. Там рассказывается и подробно описано Как создать текстовый файл на С++ и записать в него строки

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

Пишем код Как считать строки из файла на C++ ?

Вот наипростейшая программа для считывания первой строки из текстового файла, который находится по пути
C:\\FromC\\myfile.txt —
Так как это продолжение прошлой статьи , то я решил использовать тот файл, который мы там создавали. Трудностей с этим, наверное возникнуть не должно.

Но вернемся к коду. Сначала мы открываем файл для считывания из него информации, для этого используем команду ifstream, в скобках указываем либо название файла, либо путь к файлу, как сделано у меня.(«C:\\FromC\\myfile.txt»);
Когда мы открыли файл, чтобы считать из него что-то, мы объявили одну переменную типа char

Теперь нам осталось только присвоить переменной значение строки из файла. Это мы делаем командой in
Обращаем внимание на угловые скобки in>> читается как взять из потока in
Собственно, как должно быть видно из комментариев к коду программы, то чтобы переменная присвоила считываемое значение, мы должны написать её после in>>

Никакой особо сложной задачей это не представляется, особенно если вы уже прекрасно освоили и научились использовать материал прошлой статьи — всё абсолютно аналогично, только 2 команды другие

Создание файла и запись в него информации С++

Чтение текста из файла и вывода текста на экран в C++

Напишем простую программу, которая будет считывать ввод с клавиатуры текста и записывать его в файл:

В приведенных выше примерах есть один такой ОГРОМНЫЙ недостаток. Если мы будем пытаться ввести строчку, содержащую пробелы, то программа будет срабатывать не так как нам нужно. Наверное, на эту ошибку наткнулся не только я, но и многие другие люди. Поэтому я оставляю неверно приведенный код, чтобы было видно с чем можно столкнуться.

Так как книжек дома нет, я снова стал рыскать в интернете и понаходил много всякой мудреной ерунды. Но всё-таки как-то подобрал решение своей проблемы.
Помогло то, что читал о том, что cout поддерживает свои методы. И в интернете все советы идут на использование функции getline К моему счастью как использовать эту функцию я нашел очень быстро и потом использовал ее в коде.
Вообще стоит упомянуть и описать эту функцию, но пока что я не особо её понимаю, просто понимаю, что её нужно использовать и понимаю как, поэтому привожу более правильный пример нашей разрабатываемой программы:

В этом материале разобран пример посимвольного чтения информации. Так как я не описывал работу с переменными типа char , то у начинающих могут возникнуть некоторые неудобства восприятия кода. Просто я не знал, что тип char имеет какие-то особенности и думал всё проще. Поэтому некоторые непонятные моменты приведенной программы можно прочитать в следующей статье работа с char в C++ для начинающих

В остальном, приведенный пример, как в C++ считать строки из текстового файла должен быть доступен и вполне понятен. Это сейчас не оптимальный вариант реализации, и я упустил некоторые важные моменты, но так как у нас начало изучения языка C++, то этого пока вполне достаточно. Попозже я наверняка дойду до упущенного, а сейчас нужно воспринимать только самое необходимое.

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

Примечание:
break; — Это команда, которая выполняет выход из цикла. У нас если счетчик цикла for становится больше чем объявленный размер переменной char, то мы принудительно выходим из цикла
!= — это поставленное нами условие. Обозначает такое условие неравенство
if(a!=b) — Читается как если a не равно b
Начальное ознакомление с циклом for тут

endl — Это перевод курсора на новую строку внутри консоли (насколько я понял)
Эта команда похожа на"\n"

Дальше в материале использованы функции. Если вы знаете, что это и как их используют, то материал по теме:
C++ Для начинающих вывести текст из файла на экран
Без понимания работы функции будет тяжело понять C++

Для начинающих вывести текст из файла на экран без понимания работы функции будет тяжело понять

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

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

  • Aleksey ad говорит:

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

    Автор сайта отвечает:
    Aleksey ad, спасибо за проявленное внимание)) Честно говоря я не верю, что сам сильно далеко смогу уйти. Я пока стараюсь избегать указателей, т.к. для начинающих они немного запутывают смыслОдно дело веселится, другое дело не давать лишнего. Любой помощи был бы рад, т.к. один в поле не воин, как ни крути icq 586-115-460 email daslex@yandex.ru

    http://juniordeveloperad.blogspot.com/2012/04/junior-c-deloper-hi.html Вот, смотри. Я не знаю твоей мотивации и откуда ты берёшь свои азы…К примеру, по ссылке выложены задания по первой части предмета объектно-ориентированное программирование одного ииз Вузов. Могу скинуть на мыло книжку, по которой учаться студенты (её, конечно, не хватает). Про указатели скажу одно — надо разбираться. Для меня они остаются не до конца разобранными, но пользуюсь. Начал их разбирать с си. Там намного больше они участвуют в жизнедеятельности прилаги, там вообще больше ориентированно на работу с памятью. А потом перешёл на с++ и здесь опять же указатели. Многие говорят, что в с# они будут не нужны…Но я всё равно стараюсь разобраться и использовать их по максимуму 🙂 всё приходит с опытом.Кстати, в java нету указателей) Да и работа с памятью облегчена)По поводу контактов — не против, но icq не пользую. скайп скину на почту.

    Автор сайта отвечает:
    как С не С++, так и С++ не C#. java тоже – это java. К теме изучения C++ это не относится. Скорее это плюсы и минусы языков, поводы для дискуссий на форумах. по поводу книжки. может кому-то это тоже интересно и лучше дать автора и название книги сюда, чем лично мне
     
    И еще по поводу вашей ссылки я постараюсь не спорить с вами ни тут ни там, просто скажу что думаю «Начинать надо с потяжелее» – лично я считаю совершенно по другомуСтрауструп писал, что чем больше вы знаете С, тем сложнее будет перейти на С++, используя преимущества C++ (не дословно). Вы держитесь противоположной идеологии и это полностью ваше право.

    http://alfoot.net/lucik_op.doc книга преподавателей беларуского профильного вуза

  • Anonymous говорит:

    Спасибо чувак. Очень интересно написанно, а главное понятно и то, что нужно.

  • Anonymous говорит:

    endl — новая строка со сбросом буфера памяти. /n -просто новая строка.

    Автор сайта отвечает:
    Спасибо. Но глазами большинства начинающих это уточнение скорее всего мало понятно.

    Перед выводом информация обычно накапливается в буфере памяти. Манипулятор endl одновременно с переходом на новую строку осуществляет сброс буфера вывода данных, не дожидаясь момента ,когда он заполнится.

    Автор сайта отвечает:
    Был случай, что я столкнулся с разным срабатыванием этих команд в одной и той же ситуации, но пример я такой не помню и привести не могу. Если файл открыт в текстовом режиме, то не имеет значения как закрывать строку. Если программа нестабильна и нужно вывести все что есть имеет смысл использовать endl, Если очистка потока (сброс буфера памяти) не требуется, достаточно использовать «n»Можно об этом много разглагольствовать, но без примеров все эти слова мало что значат

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

    Здравствуйте!
    А как считать инфу из файла, если я не знаю заранее сколько в нем строк?

    Автор сайта отвечает:
    http://ci-plus-plus-snachala.ru/?p=51

    Спасибо, но у меня кучу ошибок выдал, в основном: невозможно переконвертировать из char const в char, также не распознал функции getch и clrscr.

    Автор сайта отвечает:
    А какой у вас компилятор?
    В моем примере были ошибки, поэтому я его переделал. Проверил. Вроде работает. но getch и clrscr зависит от компилятора. Это мелочи интерфейса. Очистка экрана и задержка, чтобы окно сразу не закрывалось.

    у меня visual c++
    ага, помню еще с паскаля про clrscr, значит выкину ее, а вместо getch system ("pause") поставлю, если не путаю. а что делать с
    char и const char?
    Я тут из учебника переписала такую программу. Она компилируется, зато вообще не понятно как работает. У меня файл открывается и сразу же закрывается, несмотря на то, что я вставила system ("pause"). А в учебнике написано тоже считывает информацию из файла.

    Автор сайта отвечает:
    а что делать с
    char и const char?
    ==========
    как я написал, у меня была ошибка.
    char FName="C:\MyFile.txt"; //было так
    char *Fname="C:\MyFile.txt" //уже там так. Благодаря вам исправлено. Посмотрите просто снова

    видимо для ms visual c++ ваша программа не годится(все ошибки в этих двух строчках const N=256; //Константный размер строки
    char *Fname="C:\text.txt";):
    c:\documents and settings\мария\рабочий стол\апка\9.файлы\9.файлы.cpp(8): error C4430: missing type specifier — int assumed. Note: C++ does not support default-int
    error C2065: ‘"C’ : undeclared identifier
    error C2143: syntax error : missing ‘;’ before ‘:’
    error C2059: syntax error : ‘:’
    error C2017: illegal escape sequence
    error C2143: syntax error : missing ‘;’ before ‘.’
    error C4430: missing type specifier — int assumed. Note: C++ does not support default-int
    error C2065: ‘FName’ : undeclared identifier

    Автор сайта отвечает:
    если вы мой пример поймете (на что я надеюсь), то когда будете лабораторные сдавать или что-то сами писать, нужно проверять на ошибки

    я эти моменты специально пропускал, чтобы код легче воспринимался, но игнорировать возможные ошибки плохо.
    =================
    а в визуал Studio задержек можно не ставить Ctrl+F5. Так попробуйте компилировать. А очистка экрана system(“CLS”); (у меня в примерах встречается иногда)

    да это-то понятно. не понятно откуда они этот файл берут! нигде путь не указан.

    Автор сайта отвечает:
    сейчас я для VisualStudio сделаю. Вы подождите чуть-чуть 🙂
     
    Всё. Для Visual Studio готово. Можете смотреть.

    а in они берут из

    http://ci-plus-plus-snachala.ru/?p=51
    тут теперь есть пример для Visual Studio

    У меня ничего не считывает.
    А паузы создают, потому что прога должна работать сама собой, прямым открытием, а не через компилятор. Не у всех есть эти компиляторы. Ну это я так просто.
     
    у меня тоже не считывает и этот не считывает. а у вас ваш пример считывает? простите за тавтологию)))

    Автор сайта отвечает:
    с чувством юмора )
     
    да. у меня VisualStudio 2005. там пример, который описывал я работает. (мы немного не в той теме комментируем, поэтому может я об одном, а вы о другом). Еще может вы пишете на русском, а вам отдает абракадабру.
    у меня ваш пример из книги тоже ничего не считывает

    вот я наконец-то пример нашла который все считывает. может кому-то пригодится

    Автор сайта отвечает:
    да, если бы еще не обрезалось все так. то было бы хорошо. Наверное не обратили внимание, что в комментариях код убивается.

  • Ваня говорит:

    Объясните, пожалуйста, значение *"" в строке:
    Спасибо.

    Автор сайта отвечает:
    честно не помню. Но попробую объяснить.

    Чуть выше вся строка была забита символом "" (пустота). Вот если в строке, считываемой из файла будет, например 3 или 4 символа, то это слишком мало и чтобы не проходить по всей строке в 255 символов, можно сделать досрочный выход из цикла for встретив символ "".

    Вроде так.

    Ясно, я вроде разобрался. Большое спасибо за ответ.

  • Aлександра говорит:

    насчёт этой строки, * это ведь указатель?
    При компиляции мне выдаёт такую ошибку "Possibly incorrect assignment"
    Через Turbo C++
     
    Из-за этого, как я думаю, из файла не выводится ничегоВ файл записывается, и всё.

    Автор сайта отвечает:
    Про вывод файла здесь
    http://ci-plus-plus-snachala.ru/?p=51

    *"" попробуйте заменить везде на NULL

  • Aлександра говорит:

    Из-за этого, как я думаю, из файла не выводится ничегоВ файл записывается, и всё.

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

    Здравствуйте! У меня вот какая проблема. Начала пробовать работу с файлами уже написала простую программку, решила попробовать что-то посложнее, но передо мной встала проблема, что выдает ошибку на первой же строке не воспринимает #include и, также, ни в какую не воспринимает строку using namespace std; Написано без ошибок, раз десять проверяла, копировала эти строки из другой, работающей программы, все равно выдает ту же ошибку. Почему это происходит и что можно с этим сделать?

    Автор сайта отвечает:
    от среды разработки зависит
    в Borland C++ 3.1
    не надо писать using namespace std


    В Visual Studio

    можно использовать using namecpace std

    iostream,fstream или другие директивы, все они с подобными правилами.

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

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

  • ktanov@bk.ru говорит:

    Спасибо Вам Всем, особенно АДМИНУ!!! Мне еще до вас далеко, но я учусь!

  • Наталья говорит:

    Автор, а Вы, случаем, не планируете сделать статью о выводе на печать? Было бы не лишнее, я думаю,учусь по Вашему блогу, а вот появилась лабораторная по теме вывода на печать из файла, а такой темы у Вас и нету, печально 🙁
    P.S. или я слепая, ткните носом тогда 😕 😳

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

    Сейчас у меня все время уходит не на блог и не на изучение С++, поэтому шансов, что эта тема появится почти нет
     
    Вот здесь немного про печать написано (я не пробовал, но буду надеяться окажется полезным)
    http://forum.developing.ru/showthread.php/2843-%D0%9F%D0%B5%D1%87%D0%B0%D1%82%D1%8C-%D0%BD%D0%B0-%D0%BB%D0%B0%D0%B7%D0%B5%D1%80%D0%BD%D0%BE%D0%BC-%D0%BF%D1%80%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B5-%D0%B8%D0%B7-DOS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BD%D0%B0-C

    Если принтер подключен к LPT-порту, то текст можно выводить как в обычный текстовый файл, только имя файла нужно указать «LPT1».
    Печать начинается сразу после получения символа новой страницы (‘\f’) или после закрытия файлового потока.

  • Sergio говорит:

    Не сразу понял, почему у меня последний пример из статьи ведёт себя неадекватно, но, поковырявшись, всё же разобрался. Итак, по-порядку (в скобках буду указывать номера строк):
    (1,2) Зачем дважды подключать библиотеку fstream.h? 🙄
    (12, 13) Грубая опечатка! При выводе информации видим только последнюю введённую строку, а дальше сплошной мусор… Подправьте:

    (18, 19, 20, 40, 48) Очень часто забываете слэши при переходе на новую строку…

    Если всё это подправить, то работает прекрасно. 😀
    P.S. В каком-то смысле проверка ваших примеров есть отличное практическое упражнение))

  • Gen говорит:

    В CODE::BLOCK не работает! Если написать

    и

    и переменную int i объявлять в каждом цикле или не циклах,а в начале программы,тогда работает.
    P.S. В каком-то смысле проверка ваших примеров есть отличное практическое упражнение

    Автор сайта отвечает:
    Разумеется там не должно работать то, что написано в динозаврах. (В borland C++ 3.1).
    Работа с переменными, объявленными в циклах, как в примере статьи (for int i=) различна для разных компиляторов. Если в компиляторе, используемом в CodeBlocks такая переменная умирает после завершения работы цикла, то в компиляторе, используемом в Borland C++ 3.1 такая переменная не умирает после завершения работы цикла. И поэтому если объявлять переменную в каждом цикле в Borland C++ 3.1, то будет ошибка типа: “одна переменная объявлена много раз”.
    Я использовал Borland C++ 3.1 потому как мне он был удобен, привычен после Turbo Pascal и мал размером.
    Но, в любом случае, правильнее использовать новые компиляторы и современные IDE

  • Sergio говорит:

    Добрый день! Интересует меня следующий вопрос:
    При чтении из файла разве не могут возникнуть никакие ошибки? Возвращает ли ifstream какое-нибудь значение при неудачной операции чтения?

    Автор сайта отвечает:
    ifstream — это не функция, это класс. Классы сами по себе ничего не возвращают.

    У классов могут быть объекты.
    У объектов класса могут быть функции (методы класса). Такие функции возвращают значения.

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

    У класса ifstream есть методы, которые возвращают значения в том числе и в зависимости от успешного или безуспешного выполнения. Т.е., объект данного класса может возвращать признак ошибки.

    Чтобы это понять лучше имеет смысл прочитать про классы.

    Спасибо за ответ!

  • Нойон говорит:

    Здравствуйте!
    У меня среда разработки RAD Studio XE3
    и тривиальная задача «открыть текстовый файл и по образцу удалить текст, далее сохранить, что осталось»
    пытаюсь написать на С++ и Delphi, пока не получается
    может сталкивались, ситуация распространенная.
    Подскажите хотя-бы направление.
    В идеале нужно обработать сотни файлов в оной папке.
    Спасибо!

  • Нойон говорит:

    Ещё раз спасибо, буду продолжать.

  • eva говорит:

    Разобралась!! Спасибо ОГРОМНОЕ!!

  • desannn говорит:

    Люди серьезно?

    Может я сейчас скажу какую-нибудь глупость но:

    1.Неужели нельзя использовать string;

    2.Неужели нельзя искать по содержимому строки?

     

  • desannn говорит:

    добавление к предыдущему комменту а если быть точным к его части 2. * а не по номеру строки.

  • desannn говорит:

    Такой вопрос :

    пишу значит программу для добавления логинов и паролей в файл используя fsteam и вроде программа выполняется без ошибок, но в файл ничего не добавляет работаю с visual studio 2013 вот код:

    внимание вопрос:

    в чем проблема?

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

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

Поиск

 
     

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

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

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

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

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