2013-03-22 2 views
0

У меня есть текстовый файл с произвольными буквами в строках и столбцах. Все, что я хотел бы сделать, это сделать массив 2d, так что это puzzle[i][j], где, если бы я положил printf("%c", puzzle[5][4]);, он просто дал бы мне символ 4-й строки и 3-го столбца (так как он начинается с 0 в массиве). Вот мой код до сих пор.Чтение текстового файла в 2d-массив

#define MAXROWS  60 
#define MAXCOLS  60 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <math.h> 

main() 
{ 
    FILE *TableFilePtr; 
    char TableFileName[100]; 
    char PuzzleFileName[100]; 
    char puzzle[MAXROWS][MAXCOLS]; 
    printf("Please enter the table file name: "); 
    scanf("%s",TableFileName); 

    TableFilePtr=fopen(TableFileName, "r"); 

    if(TableFilePtr == NULL) 
    { 
     printf("Can't open %s", TableFileName); 
     exit(EXIT_FAILURE); 
    } 

    char words; 
    int n; 
    n=0; 
    int i,j,row,col; 
    int rowcount, colcount; 
    printf("\n how many rows and colums are there? separate by a space: "); 
    scanf("%d %d",&row, &col); 
    /* while(fscanf(TableFilePtr,"%c",&words)!= EOF) 
    { 
     printf("%c",words); 
    } 
    */ 

    /*for (colcount=0;colcount<col;colcount++) 
    { 
     for (rowcount=0;rowcount<row;rowcount++) 
     { 
      printf("%c ",words); 
     } 
    printf("\n"); 
    } 
    */ 


    for(i=0;i<row;i++){ 
     for(j=0;j<col;j++){ 
      fscanf(TableFilePtr, "%c %s\n",&puzzle[i]][j]); 
       //puzzle[i][j]=words; 
    //   printf("%c ", puzzle[i][j]); 
     } 
     printf("\n"); 
    } 


} 

Закомментированная область в конце (только начальная часть) работает просто распечатать текстовый файл в компиляторе. Я бы хотел, чтобы это было в 2d массиве.

for(colcount=0;colcount<col;colcount++){...} 
+0

Uve перепутал ваше понимание индексов массива, было ли это опечаткой? –

+0

Обратите внимание, что 'puzzle [5] [4]' печатает значение в шестой строке и пятом столбце, а не в четвертой строке и третьем столбце - именно потому, что индексация начинается с 0. –

ответ

0

Я хотел бы сделать что-то вроде этого (я не использовал все свои точные имена переменных, но вы получите идею):

char puzzle[MAXROWS][MAXCOLS], line[MAXCOLS]; 
    FILE *infile; 
    int cols = 0, rows=0; 

    /* ... */ 

    infile = fopen(TableFileName, "r"); 

    while(fgets(line, sizeof line, infile) != NULL) 
    { 
     for(cols=0; cols<(strlen(line)-1); ++cols) 
     { 
      puzzle[rows][cols] = line[cols]; 
     } 
     /* I'd give myself enough room in the 2d array for a NULL char in 
      the last col of every row. You can check for it later to make sure 
      you're not going out of bounds. You could also 
      printf("%s\n", puzzle[row]); to print an entire row */ 
     puzzle[rows][cols] = '\0'; 
     ++rows; 
    } 

Edit: более короткая версия будет иметь новые строку и NULL символов в конце каждой строки, если вы не вручную их отложите. Возможно, вам придется настроить головоломку [] [] (используйте MAXCOLS +/- n или некоторые такие), чтобы заставить вас работать на вас.

for(c=0; c<MAXROWS; ++c){ 
     fgets(puzzle[rows], sizeof puzzle[rows], infile); 
    } 

В конце цикла, puzzle[x][y] должен быть 2d массив символов из вашего входного файла. Надеюсь, это поможет.

+0

, это помогает, но я получаю сегментацию error – Alex

+0

Это C для индекса массива вне границ (обычно). Помните, что подсчет начинается с 0, поэтому, если вы объявляете 'int myArray [10]', элементы равны 0-9. Если вы попытаетесь получить доступ к 'myArray [10]', вы получите seg err. – JB0x2D1

+0

Вот что я имел в виду под термином «Возможно, вам придется подстроить головоломку [] [] (используйте MAXCOLS +/- n'. – JB0x2D1

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