2015-07-03 4 views
2
#include <stdio.h> 
#include <stdlib.h> 

int main() { 

int *width; 
int *height; 
int row; 
int column; 
int character; 
int count; 
int pictureit; 
double i = 0; 
FILE *fp; 


char file[50]; 
char line[25]; // assume each line has max 25 characters 

printf("What file should we pull from: "); 
scanf("%s", file); 

//read file using File pointer 

fp = fopen(file, "r"); 

// read the first line in the file 
fgets(line, sizeof(line), fp); 

width = strtok(line,"x"); 
height = strtok(NULL, "/0"); 


// read all the future lines in the file excluding the first 
while (fgets(line, sizeof(line), fp)) { 

row = strtok(line, ","); 
column = strtok(NULL, ","); 
character = strtok(NULL, ","); 
count = strtok(NULL, "/0"); 


if(i < count) { 


**printf("%s", pictureit[row][column] = character);** 

i++; 

} 
} 
fclose(fp); 

return 0; 
} 

Я тянущий в файл с такого родом установкамногомерный массив с неизвестными элементами

75x53 
0,36,.,1 
0,37,M,1 
1,32,.,1 
1,33,:,1 
1,34,A,1 
1,35,M,2 
1,37,O,1 
1,38,:,1 
2,23,.,1 
2,24,:,1 
2,25,A,1 
2,26,M,5 

Я мозговой штурмом на некоторое время. Как я могу показать это на консоли? Очевидно, что нужно перейти в массив 2d. Программа должна знать высоту и ширину массива для отображения пробела или символа в этом месте.

PS: Эта программа покажет изображение на консоли, когда закончите. «** **» - это то место, где я работаю.

+0

Пожалуйста, союзное правильное формирование! – Olaf

+0

Я не вижу ни одного git pull. Что вы имеете в виду? – Olaf

+0

Возможный дубликат [Как изменить порядковые номера (например: 0, 36,., 1) на элементы (например: строка, столбец, символ, счет)] (http://stackoverflow.com/questions/31214251/how- to-change-sequential-numbers-ex-0-36-1-to-items-ex-row-column-char) – Olaf

ответ

4

Вы можете динамически распределить массив 2d с правильными размерами (в соответствии с вашей первой строкой), затем заполнить его данными из вашего файла и, наконец, напечатать его двумя вложенными циклами.

EDIT: В принципе, вы могли бы сделать:

//... 

//Create the dynamic array 
char ** array = malloc(sizeof(char) * height); 
int i; 
for(i = 0; i < height; i++) 
    array[i] = malloc(sizeof(char) * width); 

// Fill your array here (put different chars in it) ... 

//Print it 
int x,y; 
for(y = 0; y < height; y++) 
{ 
    for(x = 0; x < width; x++) 
     printf("%c ", array[y][x]); 

    printf("\n"); 
} 

//Free the array 
for(i = 0; i < height; i++) 
    free(array[i]); 
free(array); 

я добровольно опустить ту часть, где вы проверить возвращаемое значение таНос (будь то NULL или нет), но вы обязательно должны добавить его.

+0

Почему (сложный) «рассеянный массив», который infact не является реальным 2D-массивом, а 1D-указательным массивом? Простой 'char (* p) [width] [heigth] = malloc (sizeof * p);' будет делать также. Получите доступ к элементам как '(* p) [x] [y] = '.';'. – alk

+0

И при условии> = C99 это так же просто, как 'char a [width] [height];' не нужно выделять динамически вообще. – alk

2

Обычно я не хотел бы сделать это, но я чувствовал необходимость сделать сканирующее упражнение:

int main(void) 
{ 
    char fn[100]; 
    fprintf(stdout, "Enter file name:"); 
    fflush(stdout); 
    int result = fscanf(stdin, " %99s", fn); 
    if (1 != result) 
    { 
    fprintf(stderr, "Reading the file's name failed.\n"); 
    exit(EXIT_FAILURE); 
    } 

    { 
    size_t width= 0; 
    size_t height 0; 

    FILE * pf = fopen(fn, "r"); 
    if (NULL == pf) 
    { 
     fprintf(stderr, "Opening file '%s' failed.\n", fn); 
     exit(EXIT_FAILURE); 
    } 

    { 
     result = fscanf(pf, " %zux%zu", &width, &height); 
     if (2 != result) 
     { 
     fprintf(stderr, "Reading width and/or heigth from file '%s' failed.\n", fn); 
     exit(EXIT_FAILURE); 
     } 

     { 
     char (*pa)[width][height] = calloc(1, sizeof *pa); 
     if (NULL == pa) 
     { 
      perror("calloc() failed"); 
      exit(EXIT_FAILURE); 
     } 

     { 
      size_t number_of_rows = width * height; 

      fprintf(stderr, "Trying to read %zu data rows.\n", number_of_rows); 

      for (size_t row = 0; row < number_of_rows; ++row) 
      { 
      size_t x, y; 
      char c; 
      int i; 
      result = fscanf(pf, " %zu,%zu,%c,%d", &x, &y, &c, &i); 
      if (4 != result) 
      { 
       fprintf(stderr, "Reading data (#%zu) row from '%s' failed.\n", row, fn); 
       exit(EXIT_FAILURE); 
      } 

      /* Add check here to avoid accessing the array out-of-bounds! */ 
      (*pa)[x][y] = c; 
      } 
     } 

     { 
      for (size_t row = 0; row < width; ++row) 
      { 
      for (size_t column = 0; column < height; ++column) 
      { 
       fprintf(stdout, "%c", (*pa)[row][column]); 
      } 

      fprintf(stdout, "\n"); 
      } 
     } 

     free(pa); 
     } 
    } 

    fclose(pf); 
    } 

    return EXIT_SUCCESS; 
} 

Также мне интересно о картине, чтобы быть распечатаны ... ;-)

Смежные вопросы