Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

чтение pgm-файла(C)

3.9K
19 июня 2007 года
АКМ
49 / / 07.06.2005
Есть графический файл формата pgm. Надо считать из него числа в целочисленную матрицу, размерность которой соответствует размерам картинки.
Формат pgm имеет следующую структуру:
Код:
P2
# feep.pgm
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

- первая строка - идентификатор файла (есть всегда)
- вторая - коментарий (может отсутствовать)
- третья - размеры картинки в пикселах (могут меняться)
- 4-я - число оттенков черного (может меняться)
- далее идут числовые элементы, который надо записать в матрицу.

Надо написать на C (Microsoft Visual Studio .NET).
22K
20 июня 2007 года
Pastor
43 / / 16.05.2007
Чисто Си? или API можно использовать?
3.9K
20 июня 2007 года
АКМ
49 / / 07.06.2005
надо программу под консоль. только С.
361
20 июня 2007 года
Odissey_
661 / / 19.09.2006
Код:
#include "stdlib.h"
#include "stdio.h"
#define MAX_STR_LEN 256

struct pgm_file
{
       char ID[MAX_STR_LEN];
       char comment[MAX_STR_LEN];
       unsigned int  width;
       unsigned int  height;
       unsigned int  gradient;
       unsigned int  ** data;
};


int main()
{
    int ret=-1;
    unsigned int i,j;
    pgm_file pgm;
    FILE * ifile;
    ifile = fopen("data.png","r");
    if (!ifile)
       {
        printf("Can`t open input file\n");
        return -1;
       };
    fgets(pgm.ID , MAX_STR_LEN, ifile);
    fgets(pgm.comment , MAX_STR_LEN, ifile);
    if (pgm.comment[0] != '#')
       ret = sscanf(pgm.comment,"%d %d",&pgm.width,&pgm.height);
    else
       ret = fscanf(ifile,"%d %d",&pgm.width,&pgm.height);
    if ( ret != 2 || feof(ifile) )
       {
        printf("Input data error (width|height) \n");
        return -1;
       };
    ret = fscanf(ifile,"%d",&pgm.gradient);
    if ( ret != 1 || feof(ifile) )
       {
        printf("Input data error (gradient) \n");
        return -1;
       };
    pgm.data = (unsigned int **)malloc(sizeof(unsigned int*)*pgm.height);
    for (i = 0; i < pgm.height; ++i)
        pgm.data = (unsigned int *)malloc(sizeof(unsigned int)*pgm.width);
   
    for (i = 0; i < pgm.height; ++i)    
        for (j = 0; j < pgm.width; ++j)
            {
                 ret = fscanf(ifile,"%d", &(pgm.data[j]));
                 if ((ret != 1 || feof(ifile)))
                    {
                         printf("Input data error (data[%d,%d]) \n",i,j);
                         return -1;
                    }
            }
}


есть один минус, исправишь сам, что б интереснее было. Если после последнеего числа сразу идет конец файла, а не перевод строки, число считается ошибочным.... вообщем смотри =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог