Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Глюки с getc()

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Глюки с getc()
Имя
Сообщение << Старые топики   Новые топики >>
Глюки с 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 не совпадает. А еще лучше подскажите как заполнить двумерный массив этой хренью
Post #: 1
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() - может пригодится.
Post #: 2
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&lt;X; i++) { fgets(*(matrix + i), Y+1, fp); if(strlen(*(matrix + i))&lt;Y) fgets(*(matrix + i), Y+1, fp); } fclose(fp); } функция loadMatrix читает из файла fname двумерный массив X*Y
Post #: 3
RE: Глюки с getc() - 2007-11-10 21:29:29.243333   
spi

Сообщений: 11
Оценки: 0
Присоединился: 2007-11-01 11:33:20.090000
#include &lt;stdio.h&gt; #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&lt;X+1) { if (line[Y]!=10) {printf("Strings is too long.\n"); return -1;} //Если строка длиннее, чем нужно - пишем об ошибке for(i=0;i&lt;Y;i++) { if (line[i]&gt;='0' && line[i]&lt;='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") &lt; 0) printf("Load from file failed\n"); else { //Выведем массив на экран for (i=0;i&lt;X;i++){ for(j=0;j&lt;Y;j++) printf("%d",var[i][j]); printf("\n"); } } return 0; }
Post #: 4
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';
&nbsp;&nbsp;&nbsp; }
} ????????????????????????????????
Post #: 5
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 совершенно не оправдан.
Post #: 6
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Глюки с getc()







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.