Удаления из файла данных (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.
Программа которая приведена в этой теме работает только если в файле один столбец.
Построчно считываем файл в вектор.Вводим слово.которое хотим удалить,удаляем его и перезаписываем файл.Например так.
Работа с текстовыми файлами с помощью файловых потоков
Для работы с файлами используются специальные типы данные, называемые потоками. Поток ifstream служит для работы с файлами в режиме чтения. Поток ofstream служит для работы с файлами в режиме записи. Для работы с файлами в режиме, как чтения, так и записи служит поток fstream.
В программах на C++ при работе с текстовыми файлами необходимо подключать библиотеки iostream и fstream.
Для того, чтобы записывать данные в текстовый файл необходимо:
1. Описать переменную типа ofstream
2. Отрыть файл с помощью функции open.
3. Вывести информацию в файл с помощью cout.
4. Обязательно закрыть файл.
Для того, чтобы считывать данные из текстового файл необходимо:
1. Описать переменную типа ifstream
2. Отрыть файл с помощью функции open.
3. Считать информацию из файла с помощью cin, при считывании каждой порции данных необходимо проверять, что чтение возможно.
Запись информации в текстовый файл
Для того, чтобы начать работать с текстовым файлом необходимо описать переменную типа ofstream. Например, с помощью оператора
будет создана переменная F для записи информации в файл.
На следующем этапе файл необходимо открыть для записи. В общем случае оператор открытия файла будет иметь вид:
F.open(«file», mode);
Здесь F – переменная, описанная как ofstream,
file – полное имя файла на диске, например, D:\\STUDENT\\abc.txt.
mode – режим работы с открываемым файлом:
· ios::in – открыть файл в режиме чтения данных, этот режим является
режимом по умолчанию для потоков ifstream;
· ios::out – открыть файл в режиме записи данных, этот режим является
режимом по умолчанию для потоков ofstream;
· ios::app – открыть файл в режиме записи данных в конец файла;
· ios::ate – передвинуться в конец уже открытого файла;
· ios::trunc – очистить файл, это же происходит в режиме ios::out;
· ios::nocreate – не выполнять операцию открытия файл, если он не
· ios::noreplace – не открывать существующий файл.
· ios::binary – открыть двоичный файл
Параметр mode может отсутствовать, в этом случае файл открывается в режиме по умолчанию для данного потока
ios::in – для потоков ifstream,
ios::out – для потоков ofstream.
После удачного открытия файла (в любом режиме) в переменной F будет храниться true, в противном случае false. Это позволит проверять корректность операции открытия файла.
Открыть файл в режиме записи можно одним из следующих способов:
F.open(«D:\\STUDENT\\abc.txt», ios::out);
//Второй способ, режим ios::out
// является режимом по умолчанию для потока ofstream.
F.open(«D:\\STUDENT\\abc.txt»);
//Третий способ объединяет
//описание переменной типа поток
//и открытие файла в одном операторе.
ofstream F(«D:\\STUDENT\\abc.txt», ios::out);
После открытия файла в режиме записи, будет создан пустой файл, в который можно будет записывать информацию. Если Вы хотите открыть существующий файл, то в качестве режима следует использовать значение ios::app.
После открытия файла в режиме записи, в него можно писать точно также, как и на экран, только вместо стандартного устройства вывода cout необходимо указать имя открытого для записи файла.
Например, для записи в поток F переменной a, оператор вывода будет иметь вид:
Для последовательного вывода в поток G переменных b, c и d оператор вывода станет таким:
В качестве примера рассмотрим следующую задачу.
ЗАДАЧА. Создать текстовый файл D:\abc.txt и записать туда n вещественных
using namespace std;
//Описывает поток для записи данных в файл.
//Открываем файл в режиме записи,
// режим ios::out устанавливается по умолчанию.
cout //Ввод очередного числа.
//Запись в файл очередного числа и символа табуляции.
Чтение информации из текстового файла
Для того чтобы прочитать информацию из текстового файла необходимо описать переменную типа ifstream. После этого необходимо открыть для чтения с помощью оператора open. Если переменную назвать F, то первые два оператора будут такими:
После открытия файла в режиме чтения, из него можно считывать информацию точно так же, как и клавиатуры, только вместо стандартного устройства ввода cin необходимо указать имя открытого для чтения файла.
Например, для ввода из потока F в переменную a, оператор ввода будет иметь вид:
Для последовательного ввода из потока G в переменные b, с и d оператор ввода станет таким:
Два числа в текстовом файле считаются разделенными, если между ними есть хотя бы один из символов: провел, табуляция, символ конца строки.
Хорошо если программисту заранее известно, сколько и каких значений хранится в текстовом файле. Однако часто просто известен тип значений, хранящихся в файле, при этом количество значений в файле может быть различным. При решении подобной проблемы необходимо считывать значения из файла по одному, а перед каждым считыванием проверять достигнут ли конец файла. Для проверки достигнут или нет конец файла, служит функция
Здесь F – имя потока, функция возвращает логическое значение: true – если достигнут конец файла, если не достигнут функция возвращает значение false.
Цикл для чтения содержимого всего файла можно записать так:
обработка значения переменной a
Рассмотрим следующую задачу.
ЗАДАЧА. В текстовом файле D:\abc.txt хранятся вещественные числа, вывести их на экран и вычислить их количество
using namespace std;
//Открываем файл в режиме чтения.
//Если открытие файла прошло корректно, то
//Цикл для чтения значений из файла, выполнение цикла
// прервется, когда достигнем конца файла, в этом случае
// f.eof() вернет истину.
//Чтение очередного значения из f в переменную a.
//Вывод значения переменной a на экран.
//Увеличение количества считанных чисел.
//Вывод на экран количества считанных чисел.
//Если открытие файла прошло некорректно, то вывод
// сообщение, об отсутствии такого файла.
Существует возможность открывать файл с данными таким образом, чтобы в него можно было дописывать информацию. Рассмотрим эту возможность на примере решения следующей задачи.
ЗАДАЧА. В файле D:\abc.txt (см. рис.) хранится массив вещественных чисел, дописать в файл этот же массив, упорядочив его по возрастанию.

Рис. Содержимое файла D:\abc.txt
using namespace std;
ifstream f;//Поток для чтения.
ofstream g;//Поток для записи.
//Открываем файл в режиме чтения.
//Если открытие файла прошло корректно, то
//цикл для чтения значений из файла, выполнение цикла
// прервется, когда достигнем конца файла, в этом
// случае f.eof() вернет истину.
//Чтение очередного значения из потока f в очередной
// элемент массива a.
//Вывод элемента массива a на экран.
//Увеличение количества считанных чисел.
//Вывод на экран количества считанных чисел.
cout //Упорядочение массива
//Закрываем поток для чтения.
//Открываем поток в режиме дозаписи.
//Запись в файл символа табуляции для разделения
//последнего символа исходного файла и
// первого элемента дозаписываемого в массив.
// Запись в файл элемента массива и символа табуляции.
//Если открытие файла прошло некорректно, то вывод
// сообщения об отсутствии такого файла.
При запуске программы на экране в консольном режиме появится окно, подобное представленному на рис.. В результате работы программы изменится содержимое файла D:\abc.txt (см. рис.).

Рис. Результаты работы программы задачи

Рис. Содержимое файла D :\ abc . txt после запуска программы
Но если повторно запустить программу уже над обновленным файлом D:\abc.txt, то на экране можно будет увидеть следующее (см. рис.) и в файл D:\abc.txt станет таким (см. рис.).
Дело в том, что при первом запуске программы в файл D:\abc.txt послепоследнего элемента массива был записан символ табуляции. Таким образом, в конце файла после последнего числа находится символ табуляции. При повторном чтении информации из файла происходит следующее: программа нормально считывает последнее число, записывает его в массив. Происходит возврат к началу цикла while, программа проверяет, достигнут ли конец файла. А так как после числа есть символ табуляции (это мог быть и символ пробел, перехода на новую строку или их комбинация), то конец файла не достигнут, происходит вход в цикл. После этого оставшиеся до конца файла символы считываются и интерпретируются, как вещественное число типа float. В результате этого получается дополнительное ненужное число. На рис. – это значение -4.31602E+008.

Рис. Результаты работы программы после повторного запуска

Рис. Содержимое файла D:\abc.txt после повторного запуска программы
В этом причина неправильной работы программы при повторном запуске. Причину нашли, но как исправить работу программы? В этом конкретном случае это не сложно, надо добиться того, чтобы программа не записывала в файл символ табуляции после последнего числа. Для этого изменим последний цикл for следующим образом.
После исправлений программа будет работать правильно (рис.).

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

Рис. Содержимое файла D:\abc.txt после повторного запуска исправленной программы
Внимание. Если в текстовом файле хранятся числовые значения, то после последнего числа не должно быть пробелов символов табуляции и конца строки.
Пусть есть файл D:\abc4.txt, в котором в первой строке хранится количество значений, а далее сами значения (см. рис.).

Рис. Содержимое файла D:\abc4.txt
using namespace std;
ifstream f;//Поток для чтения данных
//Считываем из файла в переменную
//n количество вещественных чисел
//Выделяем память для массива вещественных чисел
//В цикле последовательно считываем значения
f>>a[i]; //Считывание значение из файла в массив
//Вывод элемента массива на экран

Аналогично можно работать со структурами
Рассмотрим пример: программа считывает информацию из текстового файла о студентах (Фамилия, Средний балл, Стипендия) и заносит эту информацию в массив структур.
using namespace std;
ifstream f;//Поток для чтения данных
struct student a[10];
//Считываем из файла в переменную
// n количество записей
//Выделяем память для массива
//В цикле последовательно считываем значения
//Считывание значение из файла в массив
//Вывод элемента массива на экран


Задания (без вариантов)
Как очистить файл с 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(); // закрываем файл >
Вопросы с меткой [fstream]
Заголовочный файл из стандартной библиотеки C++, включающий набор классов, методов и функций, которые предоставляют интерфейс для чтения/записи данных из/в файл.
163 вопроса
Конкурсные
Неотвеченные
- Конкурсные 0
- Неотвеченные
- Цитируемые
- Рейтинг
- Неотвеченные (мои метки)
134 показа
В каких случаях стандартные потоки C++ сообщают об ошибках через исключения?
Я никак не могу найти ответ на следующий вопрос, в каких случаях std::fstream сообщает об ошибках через исключения, а в каких — через установку флагов ошибок. Знаю про существование метода fstream.
задан 15 июн 2020 в 10:39
Несколько вопросов про std::fstream
Класс fstream наследуется от istream и ostream и ещё от других классов. В классе istream определён метод seekg, а в ostream — seekp. Так же и с функциями tellg и tellp. Правильно ли я понимаю, что .
задан 23 апр 2021 в 14:58
950 показов
Парсинг бинарного файла
Необходимо распарсить файл. Формат данных более-менее приемлимый: экспорт заявок, размер файлов 1-25 мб, в каждой строке до символа ‘:’ тэг, после него данные, строки кончаются 0x0D 0x0A, заявки .
задан 17 фев 2016 в 21:51
8k показов
Передача потока чтения из файла в функцию C++
В общем, передаю поток чтения из файла в функцию, чтобы строку считала, но вадаёт ошибку: char *readLine(ifstream in) < char *str = new char[1]; char ch = 0; int i = 0; while ((ch = .
задан 7 ноя 2017 в 11:26
802 показа
16-тиричное считывание из файла C++
Излазил вдоль и поперек форум(скорее всего чего-то не заметил). Подскажите синтаксис считывания шестнадцатеричного числа из текстового файла в переменную типа int(или может есть специальные типы .
задан 1 дек 2019 в 19:35
388 показов
С++. Дважды прочитать файл. Библиотека fstream
Доброго времени суток. Возник такой вопрос. Как в библиотеке fstream дважды прочитать файл без его закрытия? Нашел функции rewind() и fseek(file,0L,SEEK_SET), но они отказываются работать, если .
задан 31 янв 2017 в 16:12
232 показа
Прочитать с середины файл без чтения его начала на Rust’е
let f = File::open(«file»).unwrap(); let reader = BufReader::new(f).seek(io::SeekFrom::Start(2)); for b in reader.iter().next() < println!("<>«, b); > Выводит то, что находится внутри io.
задан 7 сен 2015 в 12:59
5k показов
Запись string в бинарый файл . С++
Нужна помощь. У меня есть класс с полями типа: string, int и float; Как мне занести данные даного класса в бинарный файл? Пример кода: class foo < string Name; int Age; public: void .
задан 8 апр 2017 в 13:22
486 показов
C++ fstream : Не могу записать в файл
У меня есть файл myFile.txt, который содержит числа вроде 1 2 3 4 6. Мне нужно поменять местами максимальное и минимальное значения с помощью fstream. Это моя функция. void File26() < stack
задан 22 дек 2020 в 8:08
652 показа
Некорректное чтение бинарных файлов
Мне нужно было считать три бинарных файла с заданной структурой. Структуры их таковы: Файл 1: struct data_star < long NSAO; long alpha; long beta; short ualpha; short ubeta; .
задан 20 июн 2016 в 17:12
372 показа
c++: запись файла в несуществующую папку
Подскажите пожалуйста наилучший способ как записать файл в некоторую папку folder1\folder2\. \folderN, если в наличии только папка folder1\folder2\. \folderM. При этом запись выполняется с помощью .
задан 21 фев 2019 в 9:21
494 показа
Ofstream binary не работает
Есть код: ofstream file; file.open(path, ios::out | ios::binary); char c = ‘2’; file.write(&c, sizeof(c)); file.close(); Открываю файл, в нем: 2 Что не так?
задан 25 апр 2015 в 13:54
103 показа
как считать getlin-ом с файла с++
задача проста, но не могу разобраться, мне нужно построчно считывать из файла. bkkk book; setlocale(LC_ALL, «rus»); ifstream lib(«lib.txt»); int n; lib>>n; cout
задан 12 апр 2018 в 10:49
2k показов
Нужно ли закрывать потоки ввода/вывода в конце программы?
Иногда в чьём-то коде (совершенно небольших программ, например, решений олимпиадных задач) можно встретить как в самом конце закрываются потоки I/O. Например, на Java: Scanner in = new Scanner(.
задан 19 дек 2016 в 11:09
270 показов
Как прочитать строку из бинарного файла после закрытия программы?
У меня есть структура struct Order < unsigned int productamount = 0; Products product = Products::OOPlabs; double cost = 0.0; string FIO = "Иванов Иван Иванович"; unsigned int .
задан 4 дек 2018 в 20:07
15 30 50 на странице
-
Важное на Мете
Связанные метки
Подписаться на ленту
Лента вопросов с наивысшим рейтингом по меткам [fstream]
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.