Вопрос знатокам. Работа с файлами, строками, буфером.
Что есть: открываю файл функцией 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", так как не уверен, где ему место.
Задача: сделать конвертер из текстового файла одного хитрого формата в sql базу данных. Файл представляет собой набор строк, заканчивающихся спец.символом. Формат этих строк такой, что в пределах одной строки нужно постоянно перемещаться от начале в конец и наоборот. В начале строки идут указатели (в кол-ве байт) на информацию, идущую в этой строке после определённого спец.символа. В самом начале строки 5-ю первыми байтами указана её длина.
Я сделал так: открываю файл, считываю первые 5 байт, перевожу их в число (atoi), потом, имея длину, считываю "длина строки - 5" байт в строковой массив, проверяю, есть ли в конце спец.символ, если есть, строка без ошибок. Потом этот массив записываю в файл, и с этим файлом уже работаю функциями типа fgets, fseek, fgetc, ftell, извлекая из него информацию по указателям.
С самим основным файлом в пределах одной строки так работать невозможно. Там может быть 200-300 тысяч строк, по 10-20 кб каждая.
Мне не нравиться промежуточная запись в файл. Получаеться совсем не рационально. Считывание из основного файла, запись во временный файл, работа с ним, удаления старой информации, записть новой, и так по кругу.
Вот если можно было бы работать прямо с этим массивом функциями типа fgets, fseek, fgetc, ftell или им подобными, для этого случая и предназначенными... О том и спрашиваю.
Можно, например, использовать функцию sscanf.
Выигрыш по времени, если не использовать временный файл, будет очень ощутимый.
Вообще это все функции из старого доброго c, если говорить о CPP, то его функции сплош и рядом обращаются к старым функциям С, просто обертывая их в новые названия (не всегда, конечно).
А так - создаем класс для работы с этими строчками, добавляем в него методы типа
OpenFile - Открыть файл
LoadString - Считать очередную строку
GetInfo..... - Получить из очередной строки нужную информацию
и т.п.
Вариантов решения - уйма.
Именно ради этого.
Спасибо за ответ, но появились вопросы.
Функции, мной перечисленные выше, используются из-за того, что с их помощью можно считать нужное кол-во байт из нужного места в файле.
Например, мне надо считать 12 байт начиная с 134 байта с начала строки. Функция sscanf так может?
Вот потому я и ищу возможные варианты решения.
Если под строкой имеется в виду блок байт - то тогда можно просто считывать эти блоки в буфер и обрабатывать его как угодно рассматривая как массив байт
Я так понял, управляющая информация содержится в начале блока в файле и имеет фиксированную структуру
Определяем структуру, соответсвующую структуре описания блока файла, считываем ее, Затем считываем весь блок в буфер (мы уже знаем его размер и характеристики) и вперед с песнями...
Файл состоит из строк (т.е символов, оканчивающихся парой 0D0A или все-таки совершенно самостоятельного формата (двоичный), где нет стандартного конца строки?
Вообщем, ты правильно понимаешь. Вот только я спрашивал, как или какими функциями можно работать с буффером/строкой как с файлом?
И в качестве примера требуемых функций я привёл fgets, fseek, fgetc, ftell. Если подскажешь мне похожие функции для работы со строкой/массивом или схему работы через какую-нибудь ссылку или указатель, буду очень благодарен.
А вообще, если ты напишешь мне номер своей аськи на tromp(собака)sstu(точка)smr(точка)ru, я думаю, всё пойдёт быстрее.
Спасибо.
List->LoadFromFile (Имя_Файла);
// А теперь можем читать и обрабатывать отдельные строки текстового файла через List->Strings [Номер_Строки]
delete List;
И ВСЁ - никаких сложностей с пониманием принципов работы с char*, как следствие - минимум глюков в программе :D
Если файл имеет свой собственный формат, который может допускать такие символы внутри блока, то работать с ним строковыми функциями не получится.
Работать с буфером формата char можно функциями обработки блоков памяти.
Я хотел уточнить: есть ли внутри блока спецсимволы, которые к строкам не приминимы.
Если можно использовать TStringList - то внутри данного класса есть методы разбора строк (вернее в классе TString)
Можно использовать AnsiString
Можно использовать sscanf
Но в постановке задачи я не понял - ограничивается ли строка стандартными символами. Если нет, то LoadFromFile не сработает (по крайней мере правильно)