Считывание из файла разнотипных данных, содержащихся в одной строке - C (СИ)
Формулировка задачи:
Всем доброго времени суток!
Дело вот в чем.
В файле содержатся данные в формате:
<Автор(char)> "<Название картины(char)>" <цена(double)> <возраст картины(int)>
помогите, пожалуйста, забить это в структуру(список)(В Си, не в C++):
Заранее премного благодарен!
Struct K; {char name[80]; char title[80]; double r; double age; /*ну ясно, для списка двусвязного еще указатели:*/ struct K *prev; struct K *next;
Решение задачи: «Считывание из файла разнотипных данных, содержащихся в одной строке»
textual
Листинг программы
#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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Объявляем структуру Pict_t, содержащую поля name, title, price и age
- Создаём новую структуру в динамической памяти, заполняем данными из строки и возвращаем указатель на неё или NULL
- В функции main открываем файл для чтения (или оставляем stdin для тестирования на экране)
- Устанавливаем кодировку консоли на 1251
- Запускаем цикл чтения строк из файла (или с экрана)
- Проверяем успешность считывания строки
- Если строка успешно считывается, создаём новую структуру pict и заполняем её поля
- Выводим содержимое структуры на экран
- Освобождаем память, выделенную под структуру
- Закрываем файл (или оставляем stdin)
- Возвращаем 0, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д