Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема со считыванием разнотипных данных из фай 
:(
    Опции темы
Hotrod
Дата 11.1.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 5.1.2010

Репутация: -1
Всего: -1



Всем доброго времени суток!
Дело вот в чем.
В файле содержатся данные в формате: 
<Автор(char)> "<Название картины(char)>" <цена(double)> <возраст картины(int)>

помогите, пожалуйста, забить это в структуру(список)(В Си, не в C++):
Код


Struct K;
{char name[80];
 char title[80];
 double r;
 double age;
/*ну ясно, для списка двусвязного еще указатели:*/
struct K *prev;
struct K *next;} 


Заранее премного благодарен!
PM MAIL   Вверх
bsa
Дата 11.1.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



читаешь файл построчно, затем находишь в считанной строке первое включение символа двойных кавычек, все что до него - автор, затем находишь второе включение кавычек - все что между первыми и вторыми это название, оставшуюся часть строки парсишь с помощью sscanf(str+pos+1, "%lf %lf", &picture->r, &picture->age), где str - строка считанная из файла, pos - позиция последней кавычки, picture - указатель на переменную типа struct K.
Кстати, struct K - довольно странное название. Может стоит переименовать в PicInfo или во что-то, что сможет в дальнейшем понять, что же этот тип значит?

Это сообщение отредактировал(а) bsa - 11.1.2010, 12:04
PM   Вверх
and277
Дата 11.1.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



bsa , а в с++ попроще разбор мне кажется.... smile 
PM MAIL   Вверх
bsa
Дата 11.1.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



and277
Цитата(Hotrod @  11.1.2010,  10:24 Найти цитируемый пост)
(В Си, не в C++)

PM   Вверх
and277
Дата 11.1.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



bsa , уже прочел шапку...

А поправьте меня если я ошибаюсь:    в файл нет смысла записывать объекты, в которых есть указатели? 


PM MAIL   Вверх
bsa
Дата 11.1.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Нет смысла записывать указатели. Строка в стиле Си (которая char*) тоже хранится скорее всего в виде указателя. Но почему-то ни у кого не возникает вопросов про необходимость ее сохранения. Так же и про остальные указатели - записывать нужно не значение указателя, а объект на который он ссылается, или еще как-нибудь его обозначать (индекс и т.п.).
PM   Вверх
and277
Дата 11.1.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Цитата(bsa @ 11.1.2010,  15:31)
Нет смысла записывать указатели. Строка в стиле Си (которая char*) тоже хранится скорее всего в виде указателя. Но почему-то ни у кого не возникает вопросов про необходимость ее сохранения. Так же и про остальные указатели - записывать нужно не значение указателя, а объект на который он ссылается, или еще как-нибудь его обозначать (индекс и т.п.).

Спасибо... Доходчиво объяснил
PM MAIL   Вверх
Hotrod
Дата 12.1.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 5.1.2010

Репутация: -1
Всего: -1



Код

if(!feof(f))
    { fgets(str,255,f); int q=250;
    for(i=0;i<q,str[i]!='\0';i++) q=i;
    //printf("%s",str);
    for(i=0;(str[i+1]!='"');i++) { name[i]=str[i]; n=i+1;}; 
    for((i=n+2),j=0;(str[i]!='"');i++,j++) {title[j]=str[i]; m=i;}; 
    for((i=m+4),j=0;str[i]!='"';i++,j++) {rs[j]=str[i]; p=i;};  //r  в строковом формате
    for((i=p+3),j=0;i<q;i++,j++) {ages[j]=str[i];};  //age в строковом формате
    };

 теперь остается atof(rs) и atoi(ages). А вот как это в структуру забить через указатели? Да, и еще: компилятор к name  и title добавляет какие-то странные символы, как их убрать?
PM MAIL   Вверх
Hotrod
Дата 12.1.2010, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 5.1.2010

Репутация: -1
Всего: -1





Код

if(!feof(f))
        { fgets(str,250,f); int q=250;
        for(i=0;i<q,str[i]!='\0';i++) q=i;
        //printf("%s",str);
        for(i=0;(str[i+1]!='"');i++) { name[i]=str[i]; n=i+1;}; name[n]='\0';
        for((i=n+2),j=0;(str[i]!='"');i++,j++) {title[j]=str[i]; title[i+1]='\0'; m=i;}; 
        for((i=m+4),j=0;str[i]!='"';i++,j++) {rs[j]=str[i]; p=i;};  
        for((i=p+3),j=0;i<q;i++,j++) {ages[j]=str[i];};  
        r=atof(rs); age=atoi(ages);
        };



Все, теперь помогите мне это в список загнатьsmile

Это сообщение отредактировал(а) Hotrod - 12.1.2010, 05:00
PM MAIL   Вверх
bsa
Дата 12.1.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Hotrod, а тебе нельзя пользоваться такими стандартными функциями, как strlen, strcpy, strcspn и sscanf?
Код
int age;
double cost;
char title[100];
char author[100];
...
fgets(str,250,f);
size_t authorSize = strcspn(str, "\"");
if ( (authorSize == 0) || (authorSize > sizeof(author) - 1) )
   return -1;  //author name is empty or more than 99

strncpy(author, str, authorSize); //копируем не более q1pos первых символов в author
author[authorSize] = '\0';

const char *titleBegin = str + authorSize + 1;
size_t titleSize = strcspn(titleBegin, "\"");

if ( (titleSize == 0) || (authorSize > sizeof(author) - 1) )
   return -1;  //title is empty or more than 99

strncpy(title, titleBegin, titleSize);
title[titleSize] = '\0';

if (sscanf(titleBegin + titleSize + 1, "%lf %i", &cost, &age) != 2)
   return -1; //invalid cost or age format

...


Это сообщение отредактировал(а) bsa - 12.1.2010, 11:36
PM   Вверх
xvr
Дата 12.1.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Через strtok будет еще проще:
Код

fgets(str,255,f);
char* name = strtok(str,"\"");
char* title = strtok(NULL,"\"");
char* price = strtok(NULL," ");
char* age = strtok(NULL," \n");

K* k = ...
strncpy(k->name,name,sizeof(k->name));
strncpy(k->title,title,sizeof(k->title));
k->price = atof(price);
k->age = atoi(age);

PM MAIL   Вверх
bsa
Дата 12.1.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



xvr, у тебя ошибка:
Цитата(man strncpy)
Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null terminated.

PM   Вверх
xvr
Дата 12.1.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bsa @ 12.1.2010,  13:00)
xvr, у тебя ошибка:
Цитата(man strncpy)
Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null terminated.

Я в курсе. В твоем посте (2 штуки назад) довольно подробно расписанно как использовать strncpy. 
Я написал только самую суть, что бы не загромождать текст. Надеюсь, что ТС сможет дописать остальное  smile 


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0748 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.