Вопрос знатокам. Работа с файлами, строками, буфером.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Вопрос знатокам. Работа с файлами, строками, буфером. - 2006-11-25 12:59:38.576666
|
|
|
tromp
Сообщений: 4
Оценки: 0
Присоединился: 2006-11-24 21:59:11.233333
|
Здравствуйте. Что есть: открываю файл функцией fopen, считываю строку определённой длины функцией fgets, её записываю в tempfile на винте и разбираю на части функциями типа fgets, fseek, fgetc, ftell. Что хочеться: открыть файл, считать строку опред. длины чем-то типа fgets, поместить в память (в строку/буфер), и разобрать на части чем-то типа fgets, fseek, fgetc, ftell. Эти части потом будут засунуты в sql БД. Подскажите, кто знает, как это реализовать в Си. И ещё, хотелось бы узнать, как это реализовать в C++ (В ООП). Спасибо. P.S. Я пользуюсь Borland Developer Studio 2006 со всеми вытекающими…
|
|
|
RE: Вопрос знатокам. Работа с файлами, строками, буфером. - 2006-11-25 13:30:37.920000
|
|
|
Freackazoid
Сообщений: 47
Оценки: 0
Присоединился: 2006-04-30 23:39:27
|
Я не зняток но всетаки… Разбить строку на части удбнее всего используя функцию С++ (не С, если надо чисто С, то можно в цикле) char *strtok(char*, char*); quote:
<string.h> char* strtok(char*str1, char* str2); Функция последовательно возврящает указатель на лексемы в строке адресуемой параметром str1. Символы, адресуемые строкой str2, представляют собой разделители. При отсутсвии лекскмы, подлежащей возвряту возврящаеться нулевой указатель. … (Можешь почитать в справочнике Шилдта) Например, переаем в прогу строку Ivanov Ivan Ivanich int main (char* str[]) { char * mas[3]; char *raz=",.;:!? "; int i=0; mas=strtok(str,raz); while(mas) { i++; mas=strtok(NULL,raz); } if (i>0) return 0; else return 1; }
|
|
|
RE: Вопрос знатокам. Работа с файлами, строками, буфером. - 2006-11-25 18:32:18.293333
|
|
|
tromp
Сообщений: 4
Оценки: 0
Присоединился: 2006-11-24 21:59:11.233333
|
Задача: сделать конвертер из текстового файла одного хитрого формата в sql базу данных. Файл представляет собой набор строк, заканчивающихся спец.символом. Формат этих строк такой, что в пределах одной строки нужно постоянно перемещаться от начале в конец и наоборот. В начале строки идут указатели (в кол-ве байт) на информацию, идущую в этой строке после определённого спец.символа. В самом начале строки 5-ю первыми байтами указана её длина. Я сделал так: открываю файл, считываю первые 5 байт, перевожу их в число (atoi), потом, имея длину, считываю "длина строки - 5" байт в строковой массив, проверяю, есть ли в конце спец.символ, если есть, строка без ошибок. Потом этот массив записываю в файл, и с этим файлом уже работаю функциями типа fgets, fseek, fgetc, ftell, извлекая из него информацию по указателям. С самим основным файлом в пределах одной строки так работать невозможно. Там может быть 200-300 тысяч строк, по 10-20 кб каждая. Мне не нравиться промежуточная запись в файл. Получаеться совсем не рационально. Считывание из основного файла, запись во временный файл, работа с ним, удаления старой информации, записть новой, и так по кругу. Вот если можно было бы работать прямо с этим массивом функциями типа fgets, fseek, fgetc, ftell или им подобными, для этого случая и предназначенными… О том и спрашиваю.
|
|
|
RE: Вопрос знатокам. Работа с файлами, строками, буфером. - 2006-11-25 21:46:04.980000
|
|
|
Freackazoid
Сообщений: 47
Оценки: 0
Присоединился: 2006-04-30 23:39:27
|
Честно пытаюсь разобраться в твоих словах… Абсолютно не понимаю, что же у тебя идет первым указатели или 5 байт с длиной? Похоже все-таки длина. Я понимаю так: сначала у тебя идет какое-то число, которое указывает длину твоей строки в байтах, и само это число занимает 5 байт. Потом у тебя идет определенное кол-во цифр, которые содержат длину подстрок, каждая из которых являеться одним полем данных. Потом идет спец сивол, после которого начинаеться строка, подстроки которой надо выделить. И заканчиваеться это все тоже спец символом. Во-первых: абсолютно непонятно каким образом ты обрабатываешь строки. Если ты просто разбиваешь информационную строку на подстроки, то могу предложить такой вариант. Открываешь файл fopen'ом, считываешь первые 5 байт, потом с помощью fscanf'a cчитываешь длины твоих подстрок в какой нить массив. А потом зная эти длины считываешь подстроки fges'ом, также в отдельный массив char* str[xz].
|
|
|
RE: Вопрос знатокам. Работа с файлами, строками, буфером. - 2006-11-26 02:43:11.483333
|
|
|
tromp
Сообщений: 4
Оценки: 0
Присоединился: 2006-11-24 21:59:11.233333
|
Значит так: файл -> 5 байт (длина строки) -> 1-вый указатель (например, тип 123(это неважно), длина 1234 (кол-во байт от спец.символа)), 2-й указатель и т.д. Вообщем, ты правильно понимаешь. Вот только я спрашивал, как или какими функциями можно работать с буффером/строкой как с файлом? И в качестве примера требуемых функций я привёл fgets, fseek, fgetc, ftell. Если подскажешь мне похожие функции для работы со строкой/массивом или схему работы через какую-нибудь ссылку или указатель, буду очень благодарен. А вообще, если ты напишешь мне номер своей аськи на tromp(собака)sstu(точка)smr(точка)ru, я думаю, всё пойдёт быстрее. Спасибо.
|
|
|
RE: Вопрос знатокам. Работа с файлами, строками, буфером. - 2006-11-26 16:33:22.013333
|
|
|
Freackazoid
Сообщений: 47
Оценки: 0
Присоединился: 2006-04-30 23:39:27
|
Если работать со строкой нужно именно на СИ без всяких плюсов. То есть простой выход. Всю строку можно поместить в массив типа char Т.к char на 32 разрядных системах имеет размер 1 байт то соответственно обращаться к нужным частям можно по данным указателя. т .е str[1234]. ИМХО это будет аналогично использованию fseek ftell
|
|
|
RE: Вопрос знатокам. Работа с файлами, строками, буфером. - 2006-11-26 19:12:53.466666
|
|
|
tromp
Сообщений: 4
Оценки: 0
Присоединился: 2006-11-24 21:59:11.233333
|
Спасибо за советы, буду разбираться.
|
|
|
|
|