Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Hotrod
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 97
1

Считывание из файла разнотипных данных, содержащихся в одной строке

11.01.2010, 10:21. Просмотров 815. Ответов 9
Метки нет (Все метки)

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

помогите, пожалуйста, забить это в структуру(список)(В Си, не в C++):
C
1
2
3
4
5
6
7
8
Struct K;
{char name[80];
 char title[80];
 double r;
 double age;
/*ну ясно, для списка двусвязного еще указатели:*/
struct K *prev;
struct K *next;
Заранее премного благодарен!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2010, 10:21
Ответы с готовыми решениями:

Считывание данных из файла и определение столбца, который содержит мах элемент в первой строке
считывания данных из файла и определения столбца, который содержит мах элемент в первой строке,...

Считывание и вывод на одной строке
Возможно ли переделать код ниже так, чтобы всё шло одной строкой? Console.Write(&quot;Расстояние в...

Считывание большого количества значений в одной строке без массивов
Добрый день, господа. Подскажите пожалуйста, как считать большое количество значений (1&lt;x&lt;1000) с...

Считывание данных из одной базы данных в другую.
Здравствуйте, У меня возникла необходимость извлечь данные из одной базы данных в другую....

Запрос данных из файла. Проблема в открывании файла и считывание из него данных
Не понимаю что не так, программа не хочет открывать файл... Пробовал и перемещать его, и...

9
easybudda
Модератор
Эксперт CЭксперт С++
10210 / 6109 / 1536
Регистрация: 25.07.2009
Сообщений: 11,617
11.01.2010, 11:11 2
Придумайте, как приделать к этому чтение из файла и возню с указателями. Ещё момент - поля name и title должны быть из одного слова каждое, иначе прийдётся данные в строке запятыми (к примеру) разделять...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
typedef struct {
    char name[80];
    char title[80];
    double r;
    double age;
} Pict_t;
 
int main(void){
    char buf[BUFSIZ];
    Pict_t p;
    if ( scanf("%s %s %lf %lf%*c", p.name, p.title, &p.r, &p.age) == 4 )
        printf("Name: %s\nTitle: %s\nPrice: %.2f\nAge: %.1f\n", p.name, p.title, p.r, p.age);
    return 0;
}
0
Hotrod
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 97
11.01.2010, 13:38  [ТС] 3
Там название картины в кавычках. Может, на это как-то опереться можно?
0
TanT
эволюционирую потихоньку
467 / 465 / 91
Регистрация: 30.06.2009
Сообщений: 1,399
11.01.2010, 13:48 4
Цитата Сообщение от Hotrod Посмотреть сообщение
<Автор(char)> "<Название картины(char)>" <цена(double)> <возраст картины(int)>
у тебя ещё наверно в файле каждая картина в одну строку помещается?
если так то читай строку, разбирай её по пробелам. все слова до слова начинающисяго на ' " ' это Автор,
потом ищёшь слово заканчивающееся ' " ' - получаешь название картины, ну а там цена и возраст то что осталось.

если перевода строки нет, то действительно надо опираться на ' " ', но мне кажется он там есть
0
Hotrod
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 97
12.01.2010, 00:12  [ТС] 5
TanT, а как это программно оформить? Через fgets, затем через str[i] и т.д. получается какой-то бред

Добавлено через 1 час 37 минут
Так, с отделением name от title понятно:
C
1
2
3
4
5
if(!feof(f))
    { fgets(str,255,f);
    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;}; }
//m,n - номера позиций(n-name,m - title
Но,
при этом компилятор добавляет в строки еще какие-то непонятные символы.

Добавлено через 52 минуты
C
1
2
3
4
5
6
7
8
9
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). А вот как это в структуру забить через указатели? Да, и еще: вопрос с символами в конце строки решить мне так и не удалось.
0
easybudda
Модератор
Эксперт CЭксперт С++
10210 / 6109 / 1536
Регистрация: 25.07.2009
Сообщений: 11,617
12.01.2010, 01:27 6
Hotrod, вот типа парсер с типа проверкой
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
    
#define STRLEN 80
    
/* копирует в dst из src cnt - 1 символов */
/* в стандартной функции есть неприятный косяк - см. описание */
char *strncpy1(char *dst, const char *src, int cnt){
    char *d = dst;
    while ( ( --cnt ) && ( *dst++ = *src++ ) )
        ;
    if ( *dst )
        *dst = '\0';
    return d;
}
 
 
typedef struct {
    char name[STRLEN];
    char title[STRLEN];
    double price;
    int age;
} Pict_t;
 
/* создаёт новую структуру в динамической памяти, заполняет данными из строки и возвращает указатель на неё или NULL */
Pict_t *newPict(const char *s){
    char *pStart, *pEnd;
    Pict_t *pPict;
    if ( !s || !*s )
        return NULL;
    if ( ( pPict = (Pict_t*)malloc(sizeof(Pict_t)) ) == NULL )
        return NULL;
    pStart = (char*)s;
    if ( ( pEnd = strchr(pStart, '"') ) == NULL ){
        free(pPict);
        return NULL;
    }
    while ( isspace(*(--pEnd)) && pEnd > pStart )
        ;
    strncpy1(pPict->name, pStart, ( pEnd - pStart + 2 < STRLEN ) ? ( pEnd - pStart + 2 ) : STRLEN);
    pStart = strchr(pEnd, '"');
    if ( ( pEnd = strchr(pStart + 1, '"') ) == NULL ){
        free(pPict);
        return NULL;
    }
    strncpy1(pPict->title, pStart, ( pEnd - pStart + 2 < STRLEN ) ? ( pEnd - pStart + 2 ) : STRLEN);
    if ( sscanf(++pEnd, "%lf %i", &(pPict->price), &(pPict->age)) != 2 ){
        free(pPict);
        return NULL;
    }
    
    return pPict;
}
    
    
    
 
int main(void){
        char buf[BUFSIZ];
        Pict_t *p;
        if ( !fgets(buf, BUFSIZ, stdin) )
            exit(1);
        if ( ( p = newPict(buf) ) == NULL ){
            fprintf(stderr, "Shit happens!\n");
            exit(1);
        }
        printf("Name: %s\nTitle: %s\nPrice: %.2f\nAge: %i\n", p->name, p->title, p->price, p->age);
        free(p);
        return 0;
}
0
Hotrod
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 97
12.01.2010, 02:41  [ТС] 7
C
1
2
3
4
5
6
7
8
9
10
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);
    };
Добавлено через 27 секунд
Все, теперь помогите мне это все в список загнать
0
easybudda
Модератор
Эксперт CЭксперт С++
10210 / 6109 / 1536
Регистрация: 25.07.2009
Сообщений: 11,617
12.01.2010, 09:26 8
убрал самоделку. наверное
так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
    
#define STRLEN 80
    
typedef struct {
    char name[STRLEN];
    char title[STRLEN];
    double price;
    int age;
} Pict_t;
 
/* создаёт новую структуру в динамической памяти, заполняет данными из строки и возвращает указатель на неё или NULL */
Pict_t *newPict(const char *s){
    char *pStart, *pEnd;
    Pict_t *pPict;
    int len;
    if ( !s || !*s )
        return NULL;
    if ( ( pPict = (Pict_t*)malloc(sizeof(Pict_t)) ) == NULL )
        return NULL;
    pStart = (char*)s;
    if ( ( pEnd = strchr(pStart, '"') ) == NULL ){
        free(pPict);
        return NULL;
    }
    while ( isspace(*(--pEnd)) && pEnd > pStart )
        ;
    len = pEnd - pStart + 1;
    if ( len > STRLEN - 1 )
        len = STRLEN - 1;
    strncpy(pPict->name, pStart, len);
    pPict->name[len] = '\0';
    pStart = strchr(pEnd, '"');
    if ( ( pEnd = strchr(pStart + 1, '"') ) == NULL ){
        free(pPict);
        return NULL;
    }
    len = pEnd - pStart + 1;
    if ( len > STRLEN - 1 )
        len = STRLEN - 1;
    strncpy(pPict->title, pStart, len);
    pPict->title[len] = '\0';
    if ( sscanf(++pEnd, "%lf %i", &(pPict->price), &(pPict->age)) != 2 ){
        free(pPict);
        return NULL;
    }
    
    return pPict;
}
    
    
    
 
int main(void){
        char buf[BUFSIZ];
        Pict_t *p;
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        if ( !fgets(buf, BUFSIZ, stdin) )
            exit(1);
        if ( ( p = newPict(buf) ) == NULL ){
            fprintf(stderr, "Shit happens!\n");
            exit(1);
        }
        printf("Name: %s\nTitle: %s\nPrice: %.2f\nAge: %i\n", p->name, p->title, p->price, p->age);
        free(p);
        return 0;
}
правильнее
0
Hotrod
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 97
12.01.2010, 11:05  [ТС] 9
А где указатель на файл создавать?

Добавлено через 14 минут
Че-то компилятор ничего не выдает.
0
easybudda
Модератор
Эксперт CЭксперт С++
10210 / 6109 / 1536
Регистрация: 25.07.2009
Сообщений: 11,617
12.01.2010, 11:20 10
Цитата Сообщение от Hotrod Посмотреть сообщение
Че-то компилятор ничего не выдает.
А что компилятор должен выдавать кроме файла с програмкой?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
    
#define STRLEN 80
    
typedef struct {
    char name[STRLEN];
    char title[STRLEN];
    double price;
    int age;
} Pict_t;
 
/* создаёт новую структуру в динамической памяти, заполняет данными из строки и возвращает указатель на неё или NULL */
Pict_t *newPict(const char *s){
    char *pStart, *pEnd;
    Pict_t *pPict;
    int len;
    if ( !s || !*s )
        return NULL;
    if ( ( pPict = (Pict_t*)malloc(sizeof(Pict_t)) ) == NULL )
        return NULL;
    pStart = (char*)s;
    if ( ( pEnd = strchr(pStart, '"') ) == NULL ){
        free(pPict);
        return NULL;
    }
    while ( isspace(*(--pEnd)) && pEnd > pStart )
        ;
    len = pEnd - pStart + 1;
    if ( len > STRLEN - 1 )
        len = STRLEN - 1;
    strncpy(pPict->name, pStart, len);
    pPict->name[len] = '\0';
    pStart = strchr(pEnd, '"');
    if ( ( pEnd = strchr(pStart + 1, '"') ) == NULL ){
        free(pPict);
        return NULL;
    }
    len = pEnd - pStart + 1;
    if ( len > STRLEN - 1 )
        len = STRLEN - 1;
    strncpy(pPict->title, pStart, len);
    pPict->title[len] = '\0';
    if ( sscanf(++pEnd, "%lf %i", &(pPict->price), &(pPict->age)) != 2 ){
        free(pPict);
        return NULL;
    }
    
    return pPict;
}
 
int main(void){
        char buf[BUFSIZ];
        Pict_t *p;
        FILE *f;
        f = stdin; /* вот тут надо будет открывать файл */
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        /* чтобы читать данные по строке из файла нужен цикл типа
        while( fgets(buf, BUFSIZ, f) ){
            ...
        */
        if ( !fgets(buf, BUFSIZ, f) ) /* а вот тут сейчас писать строку, как в файле для проверки */
            exit(1);
        if ( ( p = newPict(buf) ) == NULL ){
            fprintf(stderr, "Shit happens!\n");
            exit(1);
        }
        printf("Name: %s\nTitle: %s\nPrice: %.2f\nAge: %i\n", p->name, p->title, p->price, p->age);
        free(p);
        /* fclose(f); тоже лучше не забывать */
        return 0;
}
Считывание из файла разнотипных данных, содержащихся в одной строке
1
12.01.2010, 11:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2010, 11:20

Считывание одной определенной строки из файла
Недавно задался вопросом, а как считать всего одну строку из файла. Файл: 1 2 3 4 5 Как...

Слияние разнотипных данных
Буду краток. У меня есть ячейки памяти с типами данных: TCHAR, byte и int. Мне нужно их соединить...

Считывание данных с файла (С#)
подскажите, пожалуйста, как можно считать данные с файла так, чтоб потом их использовать как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru