Глюки с getc()
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Глюки с getc() - 2007-11-10 15:29:54.566666
|
|
|
drunkshadow
Сообщений: 23
Оценки: 0
Присоединился: 2007-08-31 22:36:24.460000
|
Здравствуйте! Подскажите почему если дан файл FILE *IN и в нем написано 01152 10242 12012 54103 22230 то getc(in) первым символом выдает 49, потом другую белиберду типа 53, 10… Даже с ASCII не совпадает. А еще лучше подскажите как заполнить двумерный массив этой хренью
|
|
|
RE: Глюки с getc() - 2007-11-10 16:51:48.473333
|
|
|
JD_WERT
Сообщений: 117
Оценки: 0
Присоединился: 2007-07-12 06:59:16.613333
|
quote:
Даже с ASCII не совпадает. Очень даже совпадает! Если хочешь число - отними от результата '0' или 48. int number = fgetc(hFile) - '0'; Чтобы заполнить двумерный массив, надо знать его размерность. Можно, конечно, рассчитать, но лучше первые два числа отвести на количество строк и столбцов. Если числа от 0 до 9 - то читай через fgetc() и заноси в массив, пропуская переводы строк. Также почитай хелп по fscanf() - может пригодится.
|
|
|
RE: Глюки с getc() - 2007-11-10 18:50:04.686666
|
|
|
kolPeeX
Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333
|
#define X 16
#define Y 15
int matrix[X][Y];
void loadMatrix(char *fname) {
FILE* fp = fopen(fname, "rt");
for(int i=0; i<X; i++) {
fgets(*(matrix + i), Y+1, fp);
if(strlen(*(matrix + i))<Y)
fgets(*(matrix + i), Y+1, fp);
}
fclose(fp);
} функция loadMatrix читает из файла fname двумерный массив X*Y
|
|
|
RE: Глюки с getc() - 2007-11-10 21:29:29.243333
|
|
|
spi
Сообщений: 11
Оценки: 0
Присоединился: 2007-11-01 11:33:20.090000
|
#include <stdio.h>
#define X 5
#define Y 5
int var[X][Y];
int LoadMatrix(char *filename)
{
int ch=0,i=0,j=0,*p;
char line[Y+2];
FILE *input = fopen( "stuff", "r" );
p=var[0]; //указываем на начало массива
while (fgets(line, Y+2, input) != NULL) //считываем все строки, пока не кончатся в файле
{
if (ch<X+1)
{
if (line[Y]!=10) {printf("Strings is too long.\n"); return -1;} //Если строка длиннее, чем нужно - пишем об ошибке
for(i=0;i<Y;i++)
{
if (line[i]>='0' && line[i]<='9') //если это числа...
p[j++]=line[i]-'0'; //..то заполняем массив
else {printf("File format error\n"); return -1;} //иначе пишем об ошибке и выходим
}
ch++;
}
}
return 0;
}
int main(int argc, char **argv)
{
int i,j;
if ( LoadMatrix("stuff") < 0) printf("Load from file failed\n");
else
{
//Выведем массив на экран
for (i=0;i<X;i++){
for(j=0;j<Y;j++)
printf("%d",var[i][j]);
printf("\n");
}
}
return 0;
}
|
|
|
RE: Глюки с getc() - 2007-11-11 18:54:06.340000
|
|
|
drunkshadow
Сообщений: 23
Оценки: 0
Присоединился: 2007-08-31 22:36:24.460000
|
А чем вам не нравится стандартный способ заполнения массива: for (i = 0; i <= razm; i++) { for (k = 0; k <= razm; /*массив точно как бы квадратный*/ k++) { if (getc(in) == '\n') fseek(in, 1, SEEK_CUR); massiv[k] = getc(in) - '0'; } } ????????????????????????????????
|
|
|
RE: Глюки с getc() - 2007-11-12 03:06:38.990000
|
|
|
spi
Сообщений: 11
Оценки: 0
Присоединился: 2007-11-01 11:33:20.090000
|
Если считать, что файл содержит всегда "идеальный" квадратный массив, то можно и без лишних проверок. Но в приведенном коде ошибка:
if (getc(in) == '\n') fseek(in, 1, SEEK_CUR);
massiv[k] = getc(in) - '0';
Дважды считывается символ из потока. В массив будет заноситься каждый второй символ. Так же вызов функции fseek совершенно не оправдан.
|
|
|
|
|