Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос знатокам. Работа с файлами, строками, буфером.

21K
25 ноября 2006 года
tromp
7 / / 24.11.2006
Здравствуйте.

Что есть: открываю файл функцией fopen, считываю строку определённой длины функцией fgets, её записываю в tempfile на винте и разбираю на части функциями типа fgets, fseek, fgetc, ftell.

Что хочеться: открыть файл, считать строку опред. длины чем-то типа fgets, поместить в память (в строку/буфер), и разобрать на части чем-то типа fgets, fseek, fgetc, ftell.

Эти части потом будут засунуты в sql БД.

Подскажите, кто знает, как это реализовать в Си.

И ещё, хотелось бы узнать, как это реализовать в C++ (В ООП).

Спасибо.

P.S. Я пользуюсь Borland Developer Studio 2006 со всеми вытекающими...

P.P.S. Я поместил этот вопрос и в раздел "Borland C++ Builder", так как не уверен, где ему место.
4
25 ноября 2006 года
mike
3.7K / / 01.10.2002
А можно более общими словами описать задачу? Не совсем понятно что разбирается на части ? строка или файл ?
21K
25 ноября 2006 года
tromp
7 / / 24.11.2006
Цитата: mike
А можно более общими словами описать задачу? Не совсем понятно что разбирается на части ? строка или файл ?



Задача: сделать конвертер из текстового файла одного хитрого формата в sql базу данных. Файл представляет собой набор строк, заканчивающихся спец.символом. Формат этих строк такой, что в пределах одной строки нужно постоянно перемещаться от начале в конец и наоборот. В начале строки идут указатели (в кол-ве байт) на информацию, идущую в этой строке после определённого спец.символа. В самом начале строки 5-ю первыми байтами указана её длина.

Я сделал так: открываю файл, считываю первые 5 байт, перевожу их в число (atoi), потом, имея длину, считываю "длина строки - 5" байт в строковой массив, проверяю, есть ли в конце спец.символ, если есть, строка без ошибок. Потом этот массив записываю в файл, и с этим файлом уже работаю функциями типа fgets, fseek, fgetc, ftell, извлекая из него информацию по указателям.

С самим основным файлом в пределах одной строки так работать невозможно. Там может быть 200-300 тысяч строк, по 10-20 кб каждая.

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

Вот если можно было бы работать прямо с этим массивом функциями типа fgets, fseek, fgetc, ftell или им подобными, для этого случая и предназначенными... О том и спрашиваю.

14K
25 ноября 2006 года
lesha_m
14 / / 13.12.2005
Если временный файл используется только ради использования вышеупомянутых функций, то это действительно нерационально.
Можно, например, использовать функцию sscanf.

Выигрыш по времени, если не использовать временный файл, будет очень ощутимый.

Вообще это все функции из старого доброго c, если говорить о CPP, то его функции сплош и рядом обращаются к старым функциям С, просто обертывая их в новые названия (не всегда, конечно).

А так - создаем класс для работы с этими строчками, добавляем в него методы типа
OpenFile - Открыть файл
LoadString - Считать очередную строку
GetInfo..... - Получить из очередной строки нужную информацию
и т.п.

Вариантов решения - уйма.
21K
25 ноября 2006 года
tromp
7 / / 24.11.2006
Цитата: lesha_m
Если временный файл используется только ради использования вышеупомянутых функций, то это действительно нерационально.



Именно ради этого.

Цитата: lesha_m
Можно, например, использовать функцию sscanf.



Спасибо за ответ, но появились вопросы.

Функции, мной перечисленные выше, используются из-за того, что с их помощью можно считать нужное кол-во байт из нужного места в файле.
Например, мне надо считать 12 байт начиная с 134 байта с начала строки. Функция sscanf так может?

Цитата: lesha_m
Выигрыш по времени, если не использовать временный файл, будет очень ощутимый.



Вот потому я и ищу возможные варианты решения.

14K
25 ноября 2006 года
lesha_m
14 / / 13.12.2005
Так файл текстовый или двоичный?
Если под строкой имеется в виду блок байт - то тогда можно просто считывать эти блоки в буфер и обрабатывать его как угодно рассматривая как массив байт
Я так понял, управляющая информация содержится в начале блока в файле и имеет фиксированную структуру
Определяем структуру, соответсвующую структуре описания блока файла, считываем ее, Затем считываем весь блок в буфер (мы уже знаем его размер и характеристики) и вперед с песнями...

Файл состоит из строк (т.е символов, оканчивающихся парой 0D0A или все-таки совершенно самостоятельного формата (двоичный), где нет стандартного конца строки?
21K
26 ноября 2006 года
tromp
7 / / 24.11.2006
Значит так: файл -> 5 байт (длина строки) -> 1-вый указатель (например, тип 123(это неважно), длина 1234 (кол-во байт от спец.символа)), 2-й указатель и т.д.

Вообщем, ты правильно понимаешь. Вот только я спрашивал, как или какими функциями можно работать с буффером/строкой как с файлом?
И в качестве примера требуемых функций я привёл fgets, fseek, fgetc, ftell. Если подскажешь мне похожие функции для работы со строкой/массивом или схему работы через какую-нибудь ссылку или указатель, буду очень благодарен.
А вообще, если ты напишешь мне номер своей аськи на tromp(собака)sstu(точка)smr(точка)ru, я думаю, всё пойдёт быстрее.

Спасибо.
309
26 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
Очень простой способ, работающий в BCB
 
Код:
TStringList *List = new TStringList();
List->LoadFromFile (Имя_Файла);
// А теперь можем читать и обрабатывать отдельные строки текстового файла через List->Strings [Номер_Строки]
delete List;

И ВСЁ - никаких сложностей с пониманием принципов работы с char*, как следствие - минимум глюков в программе :D
14K
26 ноября 2006 года
lesha_m
14 / / 13.12.2005
За исключением того, что в файле строкой считается последовательность любых симолов до ограничителя 0d0a, а в С еще и нельзя использовать нулевой символ в строке.
Если файл имеет свой собственный формат, который может допускать такие символы внутри блока, то работать с ним строковыми функциями не получится.
Работать с буфером формата char можно функциями обработки блоков памяти.
Я хотел уточнить: есть ли внутри блока спецсимволы, которые к строкам не приминимы.
Если можно использовать TStringList - то внутри данного класса есть методы разбора строк (вернее в классе TString)
Можно использовать AnsiString
Можно использовать sscanf

Но в постановке задачи я не понял - ограничивается ли строка стандартными символами. Если нет, то LoadFromFile не сработает (по крайней мере правильно)
21K
26 ноября 2006 года
tromp
7 / / 24.11.2006
Спасибо за советы, буду разбираться.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог