Как очистить файл с fstream
Перейти к содержимому

Как очистить файл с fstream

  • автор:

Ввод-вывод, оператор присваивания, арифметические операции

Данный листочек посвящен основам чтения данных из файлов и вывода данных в файл.

На самом деле, файловый ввод-вывод ничем не отличается от консольного. За единственным исключением – если данные читаются из файла, то в любой момент можно вернуться к началу файла и считать все заново.

Для того, чтобы в C++ работать с файлами, необходимо подключить заголовочный файл fstream :

После этого можно объявлять объекты, привязанные к файлам: для чтения данных из файла используются объекты типа ifstream (аббревиатура от input file stream, для записи данных в файл используются объекты типа ofstream (output file stream). Например

ifstream in; // Поток in будем использовать для чтения
ofstream out; // Поток out будем использовать для записи

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

После открытия файлов и привязки их к файловым потокам, работать с файлами можно так же, как со стандартными потоками ввода-вывода cin и cout . Например, чтобы вывести значение переменной x в поток out используются следующая операция

А чтобы считать значение переменной из потока in

Для закрытия ранее открытого файла используется метод close() без аргументов:

Закрытый файловый поток можно переоткрыть заново при помощи метода open , привязав его к тому же или другому файлу.

При считывании данных из файла может произойти ситуация достижения конца файла (end of file, сокращенно EOF). После достижения конца файла никакое чтение из файла невозможно. Для того, чтобы проверить состояние файла, необходимо вызвать метод eof() . Данный метод возвращает true , если достигнут конец файла или false , если не достигнут. Кроме того, состояние файлового потока можно проверить, если просто использовать идентификатор потока в качестве логического условия:

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

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

А еще полезно повторить листок «Строки».

Упражнения

  1. (A) Сумма Входной файл содержит два целых числа. Запишите в выходной файл их сумму.
  2. (B) Удалить лишние пробелы В файле записан текст, состоящий из строк. Удалите из каждой строки все лишние пробелы: лидирующие пробелы в начале каждой строки, концевые пробелы в конце строки, замените все пробелы между словами на один. Результат выведите в файл. Пример: input.txt У лукоморья
    дуб зеленый
    output.txt У лукоморья
    дуб зеленый
  3. (C) Выравнивание по левому краю Первая строка входного файла содержит целое число N. Далее (начиная со следующей строки) идет текст. Необходимо данный текст разбить на строки, длина которых не превосходит N и вывести его в файл. В каждой выведенной строке не должно быть пробелов в начале строки, пробелов в конце строки, слова в строке должны разделяться одним пробелом. При этом каждая строка должна быть максимально длинной, то есть строки формируются по «жадному» принципу: добавляем слова из входного файла до тех пор, пока длина полученной строки не превышает N, после этого ставим разрыв строки. Гарантируется, что во входном файле нет слов длиннее N символов. Пример: input.txt 20
    Для того дорога и дана, чтоб души вниманье не дремало.
    Человеку важно знать немало, потому дорога и трудна.
    output.txt Для того дорога и
    дана, чтоб души
    вниманье не дремало.
    Человеку важно знать
    немало, потому
    дорога и трудна.
  4. (D) Выравнивание по правому краю Решите предыдущую задачу при условии, что текст должен быть выровнен по правому краю, то есть каждая строка в выводе должна иметь длину ровно N символов, в противном случае ее нужно дополнить в начале строки пробелами до длины N. Последний символ каждой строки должен быть непробельным. Пример: input.txt 20
    Для того дорога и дана, чтоб души вниманье не дремало.
    Человеку важно знать немало, потому дорога и трудна.
    output.txt Для того дорога и
    дана, чтоб души
    вниманье не дремало.
    Человеку важно знать
    немало, потому
    дорога и трудна.
  5. (E) Выравнивание по ширине Решите предыдущую задачу при условии, что текст в выводе программы должен быть выровнен по ширине: первый и последний символ строки должны быть непробельными, при необходимости между словами должны быть добавлены дополнительные пробелы, при этом количество пробелов между любыми двумя словами в одной строке не должно отличаться более, чем на 1. Последнюю строку в выводе должна быть выровнена по левому краю. Пример: input.txt 20
    Для того дорога и дана, чтоб души вниманье не дремало.
    Человеку важно знать немало, потому дорога и трудна.
    output.txt Для того дорога и
    дана, чтоб души
    вниманье не дремало.
    Человеку важно знать
    немало, потому
    дорога и трудна.
  6. (F) Частотная таблица — 1 Входной файл содержит некоторый текст. Для каждой буквы латинского алфавита посчитайте, сколько раз она встречается в тексте. Заглавные и строчные буквы считайте вместе, остальные символы игнорируйте. Программа должна вывести все буквы латинского алфавита (заглавные, от A до Z, по одной букве в строке), после этого на этой же строке количество появления этой буквы в исходном тексте. Пример: input.txt AaB

Как очистить файл с fstream

Для работы с файлами в стандартной библиотеке определен заголовочный файл fstream , который определяет базовые типы для чтения и записи файлов. В частности, это:

  • ifstream : для чтения с файла
  • ofstream : для записи в файл
  • fstream : совмещает запись и чтение

Для работы с данными типа wchar_t для этих потоков определены двойники:

  • wifstream
  • wofstream
  • wfstream

Открытие файла

При операциях с файлом вначале необходимо открыть файл с помощью функции open() . Данная функция имеет две версии:

  • open(путь)
  • open(путь, режим)

Для открытия файла в функцию необходимо передать путь к файлу в виде строки. И также можно указать режим открытия. Список доступных режимов открытия файла:

  • ios::in : файл открывается для ввода (чтения). Может быть установлен только для объекта ifstream или fstream
  • ios::out : файл открывается для вывода (записи). При этом старые данные удаляются. Может быть установлен только для объекта ofstream или fstream
  • ios::app : файл открывается для дозаписи. Старые данные не удаляются.
  • ios::ate : после открытия файла перемещает указатель в конец файла
  • ios::trunc : файл усекается при открытии. Может быть установлен, если также установлен режим out
  • ios::binary : файл открывается в бинарном режиме

Если при открытии режим не указан, то по умолчанию для объектов ofstream применяется режим ios::out , а для объектов ifstream — режим ios::in . Для объектов fstream совмещаются режимы ios::out и ios::in .

std::ofstream out; // поток для записи out.open("hello1.txt"); // окрываем файл для записи std::ofstream out2; out2.open("hello2.txt", std::ios::app); // окрываем файл для дозаписи std::ofstream out3; out2.open("hello3.txt", std::ios::out | std::ios::trunc); // установка нескольких режимов std::ifstream in; // поток для чтения in.open("hello4.txt"); // окрываем файл для чтения std::fstream fs; // поток для чтения-записи fs.open("hello5.txt"); // окрываем файл для чтения-записи

Однако в принципе необязательно использовать функцию open для открытия файла. В качестве альтернативы можно также использовать конструктор объектов-потоков и передавать в них путь к файлу и режим открытия:

fstream(путь) fstream(путь, режим)

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

std::ofstream out("hello.txt"); std::ifstream in("hello.txt"); std::fstream fs("hello.txt", std::ios::app);

В данном случае предполагается, что файл «hello.txt» располагается в той же папке, где и файл программы.

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

В процессе работы мы можем проверить, окрыт ли файл с помощью функции is_open() . Если файл открыт, то она возвращает true:

std::ifstream in; // поток для чтения in.open(«hello.txt»); // окрываем файл для чтения // если файл открыт if (in.is_open())

Закрытие файла

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

#include #include int main() < std::ofstream out; // поток для записи out.open("hello.txt"); // окрываем файл для записи out.close(); // закрываем файл std::ifstream in; // поток для чтения in.open("hello.txt"); // окрываем файл для чтения in.close(); // закрываем файл std::fstream fs; // поток для чтения-записи fs.open("hello.txt"); // окрываем файл для чтения-записи fs.close(); // закрываем файл >

Удаления из файла данных (C++)

например я хочу удалить от туда запись Bobik или любую другую .

как можно сделать ? может сущетвует кой алгоритм удаления или надо мудрувать ?

15 ответов

29 октября 2007 года
256 / / 11.11.2005

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

29 октября 2007 года
140 / / 11.09.2007

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

впринцыпе все равно:p и вариант с удалением по сурагатному ключу или по совпаденю строк подходит

29 октября 2007 года
256 / / 11.11.2005
#include
#include
#include

using namespace std;

int main()
ifstream in («test.dat», ios::in);
ofstream out(«test.new», ios::out);
char buff[256];
int num,i;

Алгоритм по совпадению строк отличается парой-тройкой строк
30 октября 2007 года
140 / / 11.09.2007

max_dark спасибо за код.

я наверлно не правильно обяснил, по номеру строки не подходит.
лучше уж по совпадению строки:)))

30 октября 2007 года
1.0K / / 08.01.2007
30 октября 2007 года
140 / / 11.09.2007

m_Valery Спасибо 🙂

с кодом разобрался, только не смог асилить что значит это:

int _tmain(int argc, _TCHAR* argv[])

почему в вместо main() стоит _tmain и что за фишки: (int argc, _TCHAR* argv[])
30 октября 2007 года
1.0K / / 08.01.2007

Можешь вместо int _tmain(int argc, _TCHAR* argv[]) использовать
int main().int argc и _TCHAR* argv[]) — параметры командной строки. argc — количество параметров,argv — строки,представляющие отдельные значения. Смотри об этом подробнее в учебниках.В Visual Studio 2003,2005 используется int _tmain,в 6-й была просто main.

30 октября 2007 года
140 / / 11.09.2007

кстати а как вам такой вариант:

что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.

Tuzik <отступ>T
Shurik <отступ>T
Bobik <отступ>F
Sharik <отступ>T
Ivanov <отступ>F

там где F то значит что они «мертвые».
а там где T то значит что они «живые».

а в самой проге будет функция которая проверяет статусы и работает только с «живыми» пользователями . и функция по удалению, которая по сути статусы меняет на F

как такая идея, что скажите ?

это я делаю примочки к этому заданию:
http://forum.codenet.ru/showthread.php?t=42495

30 октября 2007 года
256 / / 11.11.2005
С такой структурой можно будет «воскрешать мертвецов» 😉
Если кого прибил по ошибке.
31 октября 2007 года
100 / / 04.09.2007

кстати а как вам такой вариант:

что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.

Tuzik <отступ>T
Shurik <отступ>T
Bobik <отступ>F
Sharik <отступ>T
Ivanov <отступ>F

там где F то значит что они «мертвые».
а там где T то значит что они «живые».

а в самой проге будет функция которая проверяет статусы и работает только с «живыми» пользователями . и функция по удалению, которая по сути статусы меняет на F

как такая идея, что скажите ?

main()
ofstream out(«dogs.dat»,ios::app);

char *name = new char[15];
char status;

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

01 ноября 2007 года
49 / / 15.10.2006

Можно функции read и write использовать, они записывают в файл структуры в текстовом виде, и соответственно могут удалять структуры

06 декабря 2007 года
2 / / 06.12.2007

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

07 декабря 2007 года
1.0K / / 08.01.2007

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

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

Как очистить файл используя файловые потоки ввода вывода не закрывая его?

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

std::ofstream file; file.open("file.txt", std::ios_base::in | std::ios_base::out); file  

В результате получаю 1A а должно быть 1
Отслеживать
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
задан 27 сен 2017 в 4:53
Rikitikitavi Rikitikitavi
2,409 4 4 золотых знака 20 20 серебряных знаков 37 37 бронзовых знаков
Вроде нельзя не закрывая файл
27 сен 2017 в 5:45
Если б было можно добраться до дескриптора файла, то может, мог бы спасти (нестандартный) chsize() .
27 сен 2017 в 5:53

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Стандартными средствами - никак.

Нестандартно - нужно получить файловый объект basic_filebuf с помощью rdbuf() , и в нем в конкретной реализации докапываться до файлового объекта - например, в VC++ - это закрытый член FILE* _Myfile . Если всяческими грязными хаками 🙂 добраться до него, то можно вызвать chsize(fileno(_Myfile)) . Но! это ОЧЕНЬ чревато неприятностями - как минимум работой через голову самого basic_filebuf , который, не подозревая о внесенных изменениях в состояние, может выдать совершенно неожиданное поведение.

Да и не стоит эта овчинка выделки. Зная, где должен заканчиваться файл - откройте новый и перепишите в него только нужное. Будет и надежнее, и проще.

Отслеживать
ответ дан 27 сен 2017 в 6:05
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков

  • c++
  • файлы
  • fstream
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *