Как сохранить файл в builder с

Обновлено: 04.07.2024

Работа с текстовыми файлами в Borland C++ Builder

Работа с файлами с использованием функций компонент

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

Эти функции особенно удобны для работы с текстовыми фыйлами.

Примеры загрузки и сохранения файлов:

При использовании функции SaveToFile если файл не существует, то он будет создан. Во всех приведенных выше примерах создаются текстовые файлы. Компонент TRichEdit создает текстовый файл в формате .rtf, поэтому логичнее записать:

Работа с текстовыми файлами с использованием методов перечисленных классов и компонент аналогична. Все они имеют счетчик строк:

Все компоненты позволяют удалять, вставлять и добавлять строки (пример удаления второй строки вставки на ее место новой строки и добовления в конец списка новой строки):

Содержимое строк можно получит по номеру строки n:

Возможно присвоить некоторой строке текст для дальнейшей манипуляции содержимым текста как единой строкой и далее перенести исправленный текст опять в компоненты:

Кроме того компоненты TComboBox и TListBox позволяют (лучше в обработчике своих событий OnChange) получить доступ к выбранным строкам:

Компоненты TComboBox и TListBox кроме того позволяют определить номер строки по тексту в строке:

Компоненты TComboBox и TListBox, класс TStringList кроме того позволяют выполнить сортировку загруженных строк:

Перечисленные методы практически полностью перекрывают все потребности для работы с текстовыми файлами. Как правило в большинстве случаев достаточными являются TMemo TrichEdit и класс TStringList.

Однако многими возможностями при работе с текстом обладает класс TFileStream.

Работа с файлами с использованием класса TFileStream

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

Создание/сохранение файла
Как создать файлы с помощью цикла, чтобы имена файлов менялись. TStringList *list = new.

Открытие и сохранение файла
Добрый вечер. Есть код void __fastcall TForm1::N3Click(TObject *Sender) < TTabSheet*.

Создание/сохранение файла
Пишет, что не может создать файл void __fastcall TForm1::Button7Click(TObject *Sender)

Сохранение и загрузка из файла
Столкнулся с проблемой загрузки из файла *.ini. для сохранения параметров программы использую.

Какой файл открываете OpenDialog'ом? В переменную какого типа его считываете? Не, там как получается. открывается одной функцие, сохраняется другой. и вот та которая сохраняет она похоже не понимает что ей надо сохранить) А что мешает открывать этой вашей "одной" функцией записывая файл в TStringList??))
А потом нормально сохранить его как я показал?
Если действительно там прям особый случай, код в студию!

TStringList - полезный тип класса. Он чрезвычайно полезен для многих видов обработок списков. Элементы в строковом списке могут быть вставлены, перемещены и отсортированы.

Список может быть сформирован строка за строкой, или загружен из большой строки разделенной запятой или даже из текстового файла. TStringList происходит от TStrings. Вы можете использовать и TStrings, но это не рекомендуется, так как он не полный - некоторые из его методов абстрактны. TStringList осуществляет эти абстрактные методы (Clear, Delete и Insert). Мы рассмотрим основные свойства и методы TStringList, включая полученные из TStrings.

Свойство Count
Возвращает число строк в списке.

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

Свойство Strings
Получает или корректирует строку по данному индексу в списке (первый элемент списка имеет индекс 0).

Обратите внимание, что свойство Strings является свойством, заданным по умолчанию. Это означает, что вы можете использовать его без его указания:

Свойство Text
Устанавливает или получает список в виде большой строки. Эта строка будет содержать каждую строку закончивающуюся комбинацией символов перевода каретки и перевода строки (CRLF). Полезно для загрузки из визуального объекта, который может содержать многочисленные строки текста.

Свойство CommaText
Получает или устанавливает список в виде большой строки. Эта строка будет иметь список строк разделенных запятыми. Это полезно для загрузки из экспорта текстовой электронной таблицы. Если при получении строка содержит вложенные пространства, то она будет заключена в двойные кавычки.

Cвойство DelimitedText
Получает или устанавливает список через большую строку. Эта строка содержит список строк разделенных значением Delimiter (по умолчанию - запятая). Строки, содержащие вложенные пробелы должны быть заключены в QuoteChar (по умолчанию - ").

Свойство QuoteChar
Используется для замыкания строк, которые имеют вложенные пробелы при использовании DelimitedText.

Свойство Delimiter
Используется для разделения строк при использовании DelimitedText
. Свойство Names
Строки в строковом списке могут быть обработаны, как пары название/значение, как во втором примере кода. Каждая строка не должна иметь никаких внедренных пробелов, и содержать знак =. Это очень полезное понятие. См. свойства Value и ValueFromIndex, и метод IndexOfName.

Свойство Values
Возвращает значение для данного названия, когда используются строки пары название/значение (см. выше).

Свойство ValueFromIndex
Возвращает значение по индексу строки (начинается с 0), когда используются пары название/значение.

Свойство CaseSensitive
Когда true, Delphi обрабатывает строки чувствительно к регистру при выполнении некоторых операций, таких как Sort.

Свойство Duplicates
Это свойство может иметь одно из следующих перечислимых TDuplicates значений:

dupIgnore Игнорирует (отбрасывает) дубликаты
dupAccept Позволяют дубликаты
dupError Выбрасывает исключение, если имеются дубликаты


Свойство Sorted
Когда true, все строки будут добавляться в свою позицию отсортированной последовательности. Когда false, они будут добавляться в конец. См. также метод Sort.

Свойство Objects
Возвращает объект, связанный со строкой по данному индексу, если он существует.

Метод Add
Добавляет данную строку в список, возвращая ее позицию в списке (начинается с 0).

Метод Append
Так же как и Add, но без возвращения индексного значения.

Метод Insert
Вставляет строку в заданную индексом позицию. Позиция 0 вызовет вставку в начало.

Метод Delete
Удаляет строку по данному индексу.

Метод Clear
Удаляет все строки из списка.

Метод Move
Перемещает строку из одной позиции в другую, сдвигая другие строки соответственно.

Метод Exchange
Перестанавливает две строки в списке, идентифицированные по их индексным позициям.

Метод IndexOf
Получает индекс позиции строки в списке соответствующей данной строке. Если строка не найдена, то возвращается -1.

Метод IndexOfName
Получает индекс позиция первой пары название/значение строки, где название соответствует данной строке. Если не найдена - возвращается -1.

Метод Find
То же самое, что и IndexOf, но с использованием списков сортированных строк.

Метод Sort
Если Sorted является ложным, то это вызовет сортировку списка.

Метод AddStrings
Добавляет строки из другого списка.

Метод Assign
Заменяет текущий список содержанием другого списка.

Метод LoadFromFile
Очень полезный метод, загружает строковый список из текстового файла. Каждая текстовая строка (законченая CRLF - см. DelimitedText) становится строкой списка.

Метод SaveToFile
Сохраняет строковый список в текстовый файл.

вот, что еще надо? Сорри, могу только так выложить, ибо с телефона

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

Добавлено через 3 минуты
Вам уже предлагали сделать так:

file->SaveToFile(SaveDialog1->FileName);
improper us of typedef "file" file->SaveToFile(SaveDialog1->FileName);
improper us of typedef "file" Дада, file надо объявлять глобальной переменной. LK поправил и имена давать свои, а не соотносящиеся с определениями ИДЕ, имхо. и имена давать свои, а не соотносящиеся с определениями ИДЕ, имхо. там о ключевых отсуствовало, ключевые слова и определения системы и/или ИДЕ - разные вещи, имхо И что, file подпадает под определения системы или ИДЕ? Тогда почему с ним всё компилируется и работает? Где можно взять определения конкретной системы/ИДЕ, в частности BCB?
Не сохраняет ивсе) хоть убейте. делал и как вы писали.. не понимаю. Максимум чего я добился - сохраняет что то в файл и то, помоему он олжен быть уже создал

Открытие и закрытие файлов

Для работы с файлами используются указатели на структуру типа FILE, которая определена в библиотеке <stdio.h>. Объявление файлового потока выглядит так:

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

Имя_файла — это имя файла на диске, оно указывается единственный раз при открытии. Во всех остальных операциях участвует указатель на FILE. Количество открытых одновременно файлов ограничивается константой FOPEN_MAX, определенной в заголовке <stdio.h>.
Режим — это строка, задающая способ дальнейшей обработки файла. Режимы перечислены в табл. 10.4.

Таблица 10.4. Режимы открытия файла

Обозначение Смысл

"r" или "rt" Открыть текстовый файл для чтения. Если файл не обнаружен, функция возвращает ноль (нулевой указатель).
"w" или "wt" Создать текстовый файл для записи. Если файл существует, содержимое файла уничтожается.
"a" или "at" Открыть для добавления строк в конец текстового файла. Если файла нет, он создается.
"r+" или "r+t" Открыть существующий текстовый файл для чтения и записи.
"w+" или "w+t" Открыть новый текстовый файл для чтения и записи. Если файл существует, то его содержимое уничтожается.
"a+" или "a+t" Открыть для чтения и добавления строк в конец текстового файла. Если файла нет, он создается.
"rb" Открыть двоичный файл для чтения. Если файл не обнаружен, функция возвращает ноль (нулевой указатель).
"wb" Создать двоичный файл для записи. Если файл существует, содержимое файла уничтожается.
"ab" Открыть для добавления записей в конец двоичного файла. Если файла нет, он создается.
"r+b" Открыть существующий двоичный файл для чтения и записи.
"w+b" Открыть новый текстовый файл для чтения и записи. Если файл существует, то его содержимое уничтожается.
"a+b" Открыть для чтения и добавления записей в конец двоичного файла. Если файла нет, он создается.

Файл закрывается с помощью функции fclose() с прототипом Имя указателя должно совпадать с тем, которое использовалось при открытии. В случае успешного закрытия возвращается 0, иначе — константа EOF. Закрыть открытый выше файл Readme.txt нужно так: Поток по умолчанию буферизован, поэтому закрытие файла освобождает буфер. Однако имеется возможность явно указать освобождение буфера в любой момент работы программы, не закрывая файл. Для этого используется функция Аналогично функции закрытия файла в случае успешной записи буфера в файл возвращается ноль, иначе — EOF.
Важнейшей функцией является функция, проверяющая, достигнут ли конец файла. Ее прототип Очевидно, конец файла может обнаружиться только при чтении из файла. Если в результате очередной операции ввода достигнут конец файла, система устанавливает внутренний индикатор конца файла. Этот индикатор и проверяет данная функция. Если достигнут конец файла, то функция возвращает ненулевое значение, иначе возвращается 0.
С открытием файла связана одна очень распространенная ошибка начинающих программистов, на которую хочется обратить внимание. Предположим, мы обрабатываем текстовые файлы и решили написать функцию, которая открывает файл и обрабатывает ошибки открытия. Определение такой функции может быть таким: Вроде бы в определении ничего крамольного не наблюдается. Однако вызов такой функции не принесет желаемых результатов.

Двоичные файлы

Двоичные и текстовые файлы — это, как говорят в Одессе, «две большие разницы». Обмен данными между программой и двоичным потоком выполняется без всякого преобразования, поэтому работает быстрее. Двоичный ввод выполняется функцией fread(), имеющей следующий прототип:

Тип size_t обычно определен как unsigned int. Первый параметр часто определяет массив (или указатель на динамический массив), в который будет прочитана информация; третий параметр задает размер одного элемента данных в байтах, а второй — количество читаемых элементов. Четвертый параметр определяет двоичный файл, из которого информация вводится. Общее количество считанных байтов равно size*n. Однако возвращает функция количество корректно прочитанных элементов, а не байтов.
Вывод в двоичный файл выполняется функцией fwrite(), которая имеет совершенно аналогичный прототип: Функция записывает n элементов размера size в двоичный файл stream из буфера, указатель на который задается в качестве первого аргумента. Общее количество выводимых байтов равно size*n. Однако возвращает функция количество корректно записанных элементов, а не байтов.
В качестве элементов могут использоваться любые переменные любых типов, в том числе и динамические. Даже массив может быть одним-единственным элементом! Рассмотрим несколько простых примеров, аналогичных примерам для текстовых файлов (см. листинги 10.8,10.9). Создадим на диске C: каталог BinFiles и все двоичные файлы будем размещать в нем. Переделаем пример создания файла (листинг 10.12). В этой программе сначала создается два двоичных файла: number1.bin и number2.bin. В первый файл целые числа из массива m записываются по одному в цикле. Во второй файл весь массив записывается сразу как один элемент. Затем файлы открываются для чтения. Сначала открывается файл number2.bin (в который мы писали массив целиком), и чтение из него выполняется по одному числу. Проверка конца файла делается так же, как и для текстовых файлов. На экране видно, что чтение выполняется совершенно правильно.
Первый файл number1.bin, который записывался в цикле по одному числу, читается сразу целиком в массив t, а вывод осуществляется по одному числу. И снова мы наблюдаем на экране, что чтение выполнилось совершенно правильно. Такое «смешивание» для двоичных файлов безопасно, так как и в памяти, и на диске размеры данных равны sizeof(тип)*n, где n — количество элементов, участвующих в обмене.
Теперь добавим в конец этого примера строки, выполняющие суммирование чисел, записанных в файл number1.bin. Как видим, этот текст отличается от приведенного выше для текстовых файлов только режимом открытия и функцией ввода данных.
Так как функции посимвольного ввода/вывода fgetc() и fputc() фактически не выполняют никакого преобразования информации, то копирование двоичных файлов можно делать точно так же, как и текстовых — посимвольно. Используем функцию filecopy(), представленную в листинге 10.9. Соответственно и для объединения файлов можно использовать ту же функцию — все определяется режимом открытия файла. Для проверки правильности объединения выведем содержимое файла на экран. Используем вторую форму проверки окончания файла — внутри цикла:

Размеры объектов в файле

Как мы уже знаем (см. гл. 1), размеры классов и структур в памяти зависят от выравнивания. Рассмотрим тот же вопрос с точки зрения записи в двоичный файл. Напишем простую программу (листинг 10.13), в которой просто выведем в двоичный файл несколько структур в двух режимах: с выравниванием по байту и без.

, то размеры структур станут равны 13 — столько же и записывается в файлы.

В системе Borland C++ Builder 6 наблюдается аналогичная картина. При отсутствии выравнивания на диск записывается 8, 16 и 24 байта . При наличии директивы выравнивания на диск записывается столько же байт, как и в системе Visual C++ — 1,13 и 13 байт.

Запись была обновлена

Компонент OpenDialog служит для открытия указанного файла и загрузки данных. Компонент SaveDialog, соответственно, необходим для сохранения данных в файл. Все свойства у компонентов идентичны, но немного отличаются только по смыслу назначения.

Свойство FileName

Является основным свойством компонентов OpenDialog и SaveDialog, которое возвращает пользовательский файл FileName в виде строки. Можно задать значение свойства перед обращением к диалогу, в этом случае, при появлении окна загрузки/сохранения файла будет задано имя файла по умолчанию.

Свойство Filter

Указывает какие типы файлов можно загружать в приложение или в какие типы файлов приложение будет сохранять данные. Во время программирования следует указывать параметры свойства Filter, чтобы ограничить компонентам OpenDialog и SaveDialog диапазон типов файлов. Чтобы открыть окно редактора, следует нажать на многоточие рядом со свойством Filter в окне «Инспектор объектов». В столбце FilerName указывается название типов файлов, которое будет отображаться в выпадающем списке. В столбце Filter указывается тип файлов.

Свойство Filter

Также значение свойства можно задавать программно для компонента OpenDialog или SaveDialog.

Пример создания фильтра

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

Свойство FilterIndex

Задаёт для компонента OpenDialog или SaveDialog какой фильтр будет отображаться по умолчанию. Свойство FilterIndex удобно использовать, когда указан не один фильтр типов файлов, а несколько, и чтобы вручную не переписывать все. Так гораздо удобнее, указав значение FilterIndex = 1, в этом случае по умолчанию будет показан первый фильтр по списку.

Свойство InitialDir

Задаёт начальный каталог, который будет показан в момент открытия диалогового окна OpenDialog или SaveDialog. В случае, если свойство InitialDir не задано, будет открыт текущий каталог или каталог, к которому пользователь в последнее время обращался во время работы приложения. Рекомендуется указывать путь каталога, если приложение использует, например, собственный тип файлов.

Свойство DefaultExt

Задаёт расширения файла в строке названия по умолчанию. Если свойства не задано, то пользователю необходимо указать в диалоговом окне полностью имя файла с расширением. Если указать значение, то пользователю достаточно написать только имя файла, а расширение будет задано автоматически.

Свойство Title

Задаёт имя заголовка диалогового окна OpenDialog или SaveDialog. Если свойство не задано, то откроется диалоговое окно с заголовком, заданным системой. Если указать значение свойству, например, «Укажите имя и тип файла», то открываемое диалоговое окно будет с указанным заголовком.


Поместить на форму следующие компоненты, расположенные на закладках Win3.1 и Standard:

DriveComboBox с помощью него создаётся выпадающий список в котором отображаются названия всех носителей присутствующих в системе. С помощью него мы будем осуществлять переход от одного диска к другому;

DirectoryListBox с помощью него будет отображаться дерево каталогов выбранного диска;

FileListBox с помощью него отображается список файлов выбранной директории;

Edit1 (для отображения пути к выбранному файлу) и Edit2 (для отображения результата);

Lable1, Lable2, Lable3, Lable4, Lable6, Lable7 (для отображения комментариев);

Button1, Button2, Button3, Button4;

Настроить свойства используемых компонентов

Выделить компонент DriveComboBox и открыть закладку Properties инспектора объектов. Открыть список в свойстве DirList и выбрать в нём компонент DirectoryList1, теперь в нём будут отображаться каталоги с выбранного диска;

Выделить компонент DirectoryListBox щёлкнув по нему левой кнопкой мыши и в свойстве FileList выбрать компонент FileListBox1 из выпадающего списка;

Изменить свойства Caption в элементе Lable1соответственно на «Выбрать диск»;

Изменить свойства Caption в элементе Lable2 соответственно на «Выбрать директорий»;

Изменить свойства Caption в элементе Lable3 соответственно на «Выбрать файл»;

Изменить свойства Caption в элементе Lable4 соответственно на «Нажать на кнопку «Установить»;

Изменить свойства Caption в элементе Lable5 соответственно на «Полученный путь к файлу»;

Изменить свойства Caption в элементе Lable6 соответственно на «Открыть файл»;

Изменить свойства Caption в элементе Lable7 соответственно на «Результат»;

Изменить свойства Caption в элементах Button1, Button2, Button3 и Button4 на «Установить», «Открыть», «Результат» и «Выход» соответственно;

Убрать в свойстве Text элементов Edit1 и Edit2 содержимое.

Приступить к обработке событий.

Начать с нажатия кнопки «Установить» на форме Form1. Прежде всего активизировать кнопку, с которой будем работать. Затем перейти в инспектор объектов и активизировать страницу событий (Events). На ней можно обнаружить список всех возможных событий для активного компонента (в данном случае кнопки). Нас интересует событие OnClick, возникающее при нажатии кнопки. Чтобы определить обработчик этого события, необходимо сделать двойной щелчок мыши в поле значения. Появится окно редактора кода с заготовкой для нашего обработчика, в котором необходимо написать код
Edit1->Text=FileListBox1->FileName;

Написать следующий код для обработки события при нажатии на кнопку «Открыть»:

if((F=fopen(Edit1->Text.c_str(),"rt"))==NULL) // проверка открытия файла

ShowMessage ("Файл не удаётся открыть");

else ShowMessage ("Файл открыт");

// Чтение информации из файла

// Оператор чтения целой переменной из файла

// и помещение ёё в соответствующую переменную массива

fscanf(F,"%d",&Mint[i][j]); // &Mint[i][j] - Указатель на массив

// После того как закончили чтение из файла его необходимо закрыть

Написать следующий код для обработки события при нажатии на кнопку «Результат»:

int A; // переменная для результата

Написать следующий код для обработки события при нажатии на кнопку «Выход»: Close();

Поместить в начало программы описания файла, массива и переменных для цикла;

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

Выполнить команду Run/Ran;

Выбрать диск, выбрать директорий, выбрать файл, нажать на кнопку «Установить», нажать на кнопку «Открыть», нажать на кнопку «Результат», посмотреть результат и нажать на кнопку «Выход».

FILE*F; // описание файла

int Mint[3][3]; // описание массива

int i,j; // описание переменных для циклов

__fastcall TForm1::TForm1(TComponent* Owner)

void __fastcall TForm1::Button4Click(TObject *Sender)

void __fastcall TForm1::Button1Click(TObject *Sender)

// Помещение выбранного пути в Edit1 для использования в операторе

void __fastcall TForm1::Button2Click(TObject *Sender)

if((F=fopen(Edit1->Text.c_str(),"rt"))==NULL) // проверка открытия файла

ShowMessage ("Файл не удаётся открыть");

else ShowMessage ("Файл открыт");

// Чтение информации из файла

// Оператор чтения целой переменной из файла и помещение ёё в соответствующую переменную массива

fscanf(F,"%d",&Mint[i][j]); // &Mint[i][j] - Указатель на массив

Читайте также: