реклама на сайте
подробности

 
 
> scanf чтобы считал не более чем, и потом начал с разделителя
megajohn
сообщение Sep 22 2016, 19:45
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



вот есть такой код http://codepad.org/RxvUownH

проблема в том, что поле ftp_upload больше чем зарезервировано и разрывается на части. Зарезервировать заведомо больше тоже нет возможности, так как не известен максимум
как правильнно написать строку формата чтобы получилось

permissions="-rw-r--r--"
links_qnty=1
owner="ftp_uplo" (без ad так как нафиг не нужно )
group="5001"
size=25952
date_month="Sep"
date_day=22
time="19:15"
filename="1_20160922221553000"


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
CrimsonPig
сообщение Sep 22 2016, 20:01
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(megajohn @ Sep 22 2016, 20:45) *
проблема в том, что поле ftp_upload больше чем зарезервировано и разрывается на части. Зарезервировать заведомо больше тоже нет возможности, так как не известен максимум
как правильнно написать строку формата чтобы получилось


Ну так порежьте исходную строку на токены каким-нибудь strtok или ручками, по пробелам.
Зачем переливать подстроки из исходной строчки в локальные буфера, если можно найти указатели на пробелы в исходной строке ?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Sep 23 2016, 06:36
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Сперва контролируем границы строк, поытаемся "собрать" чтобы данные не получились на границе разрыва
Если текстовый файл - то по CRLF.
Далее - можно так
Код
n = sscanf( mem, "%20s", &to_mem ); прочитать не более 20 символов
if(n) .....
{
   n = sscanf( to_mem, "HEADER_SIGN%.2d", &my_2D"); при наличии сигнатуры - читаем 2 символа как десятичную цифру
   if( n == 0 )
   {
   }
   else
    if( n ..... )
   {
   }
   else ....

}
else .....


ps - сперва ужмите ВСЕ пробелы до одного.
Затем - вводите поля по шаблонам, с учетом того, что сами данные могут содержать пробелы. Но уже не более одного.
Сразу вводите обработку ошибок формата, иначе отладка будет спортивная.


Сообщение отредактировал k155la3 - Sep 23 2016, 07:28
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 23 2016, 07:32
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



sscanf(in_buffer, "%7s%*s", owner) не оно? Точнее не так, а
CODE
sscanf(in_buffer, "%7s", owner); if(strlen(owner) == 7) sscanf(in_buffer, "%*s");

http://www.c-cpp.ru/content/scanf


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
megajohn
сообщение Sep 23 2016, 19:10
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(CrimsonPig @ Sep 22 2016, 23:01) *
Ну так порежьте исходную строку на токены каким-нибудь strtok

хороша идея, но применю strtok_r так как мультизадачность.



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 22:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016