0:00
Замечу, что читать
из потока можно не только с помощью функции getline,
а также с помощью операторов входа, они же галочки.
Давайте попробуем решить ту же самую задачу, но записывать данные будем не
в строковую переменную, а, например, в переменные типа int.
Давайте изменим тип переменных со string на int
и обратим их в 0, установим по умолчанию в 0.
После этого...
Так, это мы тоже можем стереть.
Из потока input мы считаем в переменную year наш код.
После этого в потоке input следующим входным
символом будет символ − Нам надо от него избавиться.
У потоков чтения есть метод ignore, который на вход принимает целое число,
который говорит, сколько следующих символов нам нужно пропустить.
Давайте воспользуемся им.
input.ignore(1) — потому что у нас один минус — а после
этого считаем аналогичным образом месяц и день.
Скомпилируем наш код.
Видим, что мы получили точно такой же результат.
2017 1 25.
25 января 2017 года.
Каким методом пользоваться, зависит от конкретной ситуации.
Если вам надо считать строчку, а затем как-то ее преобразовывать, например,
у вас там лежат бинарные данные, JSON или что-то еще,
порой бывает удобнее сначала считать всю строку целиком.
Если это разделенный через определенные разделители файл в определенном формате,
то бывает удобнее пользоваться оператором ввода.
Хорошо.
Давайте рассмотрим, как же писать данные в файл.
Для записи в файл мы можем воспользоваться классом ofstream.
Давайте создадим переменную output,
и пусть наш файлик будет называться output.txt, например.
Хорошо.
Давайте в него что-нибудь запишем.
output << "hello" [ЗВУК] Ну и мы же теперь умеем читать из файла.
Давайте его откроем и прочтем, что же там будет написано.
Объявим переменную ifstream,
input и будем читать из файла output.txt.
Заметьте, у меня тут появилось дублирование кода, это плохо.
Давайте объявим переменную типа string, назовем ее path,
положим туда текст output.txt.
Это будет путь до нашего текстового файла.
Замечательно.
Мы избавились от дублирования.
Давайте продолжим выводить наш файл на экран.
Проверим, что входной поток доступен.
После этого воспользуемся функцией getline, getline.
На вход ей передадим поток, и также нам нужно объявить переменную,
в которую мы будем записывать данные.
Построчно считаем в нее файл и выведем его на экран.
[ЗВУК] hello.
Это ровно то, что мы и записали.
Кстати, мы же можем теперь сделать функцию,
которая будет нам считывать весь файл.
Давайте назовем ее ReadAll, на вход она будет принимать ifstream по ссылке, и все.
Положим туда
этот код.
Точнее, лучше сделать так, чтобы она принимала path.
И передадим его по ссылке.
После этого выведем ее.
ReadAll(path); Замечательно.
Наш код скомпилировался и вывел hello.
Что, если мы хотим не записывать каждый раз файл заново, то есть смотрите,
каждый раз, когда мы открывали файл вот в этой строке, его содержимое удалялось?
и запись начиналась заново.
Ну то есть давайте туда попробуем записать какую-нибудь другую строчку.
Например, world.
И скомпилируем данный код.
Видим, что вывелось на экран только world.
И даже если записать туда одну букву,
будет выведена одна буква, h.
Что ж, давайте попробуем дозаписать наши данные.
Запишем туда hello, ну а теперь давайте попробуем через
пробел дописать туда world и восклицательный знак.
Для того, чтобы открыть файл в режиме дозаписи,
надо передать туда специальный флажок.
ios::app app — это сокращение от append.
Давайте запустим данный код.
Мы видим, что в файле появились строчки hello world!
Замечу, что вы, наверное, ожидали сейчас увидеть все в одну строчку.
Но нет, так как мы сюда пишем endl, после hello был перенос строки,
и дописали «пробел world», но уже после переноса строк.
Только что мы с вами прошли великий путь,
в котором мы научились работать с текстовыми файлами.
Мы научились читать их, читать их и выводить на экран,
а также записывать в них.
Также в случае необходимости, если нам такое понадобится,
мы сможем дозаписать данный файл.
Замечу, что читать файлы теперь мы можем как построчно, так и в определенном
формате, чтобы не выполнять преобразование данных внутри нашего программного кода.