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
чтение pgm-файла(C)
Формат pgm имеет следующую структуру:
Код:
- первая строка - идентификатор файла (есть всегда)
- вторая - коментарий (может отсутствовать)
- третья - размеры картинки в пикселах (могут меняться)
- 4-я - число оттенков черного (может меняться)
- далее идут числовые элементы, который надо записать в матрицу.
Надо написать на C (Microsoft Visual Studio .NET).
Чисто Си? или API можно использовать?
надо программу под консоль. только С.
Код:
#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;
}
}
}
#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;
}
}
}
есть один минус, исправишь сам, что б интереснее было. Если после последнеего числа сразу идет конец файла, а не перевод строки, число считается ошибочным.... вообщем смотри =)