Считывание из файла разнотипных данных, содержащихся в одной строке - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Объявляем структуру Pict_t, содержащую поля name, title, price и age
  3. Создаём новую структуру в динамической памяти, заполняем данными из строки и возвращаем указатель на неё или NULL
  4. В функции main открываем файл для чтения (или оставляем stdin для тестирования на экране)
  5. Устанавливаем кодировку консоли на 1251
  6. Запускаем цикл чтения строк из файла (или с экрана)
  7. Проверяем успешность считывания строки
  8. Если строка успешно считывается, создаём новую структуру pict и заполняем её поля
  9. Выводим содержимое структуры на экран
  10. Освобождаем память, выделенную под структуру
  11. Закрываем файл (или оставляем stdin)
  12. Возвращаем 0, чтобы указать, что программа успешно завершилась

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы