Считать данные из txt.file и распечатать содержимое 2D-массива - PullRequest
3 голосов
/ 24 ноября 2011

Мне нужна помощь, я хотел бы распечатать информацию из файла (в символах)

Я решил использовать 2D-массив, так как данные выглядят примерно так

0 0 . . . 
0 0 . . . 
. . . . . 
. . . . . 
. . . . . 

Кажется, я не могу распечатать их с кодом, который я подготовил сейчас

, пожалуйста, см. Ниже:

/* Read from file, pass on file contents to a 2D array, Print file contents from 2D array*/

#include<stdio.h>
#include<string.h>
#define N 5


//My proposed function to print an array with contents from a file
void printboard(int **a, int n, int n);

int main(int argc, char *argv[])
{   
    char linestr[100];
    int board[N][N];
    int k;
    int h=0, l=0; 
    if(argc==2) //File should be called from the terminal hence working with argc & argv
    {
        FILE *fp;
        fp = fopen(argv[1], "r");


     if(fp == NULL) 
        {
            printf("Error, can't open '%s' file!!!\n", argv[1]);
            return -1;
        }
    while (fgets(linestr,sizeof linestr, fp) != NULL)
        for(k=0; k<strlen(linestr); k++)
        {
            if (linestr[k]!='\n')
            {
                board[h][l]=(int)linestr[k];
                l++;


            }
            h++;
            l=0;
        }
        fclose(fp);
    }
    printboard(board,h,l);

return 0;
}

void printboard(int **a, int n, int n)
{
    int i, j;
    for (i=0; i< N; i++)
    {
        for (j=0; j< N; j++)
        {
            printf("%c", a[i][j]);
        }
        printf("\n");
    }


}

У меня есть базовые знания в C, и я начал программировать только 1,5 месяца назад,Есть ли какой-нибудь совет от сообщества, как я могу это исправить или сделать это лучше?Цель состоит в том, чтобы напечатать содержимое файла в формате 2D-массива.Мне бы очень хотелось, чтобы данные работали с 2D-массивом, потому что мне нужно работать над ним, чтобы переместить «0» в игре под названием Peg Solitaire.

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Имена аргументов в функциях должны быть уникальными.Таким образом, ваша функция печати не может иметь два аргумента "n", вам придется изменить одно имя (на "m" или что-то еще).Кроме того, поскольку вы печатаете матрицы nxn и вы определили «N» через препроцессор, вам даже нужны эти аргументы?:)

Передача массива (первый аргумент printboard) немного сложнее и требует некоторых знаний о том, как работают указатели и память.Смотрите обсуждение здесь:

http://cboard.cprogramming.com/c-programming/97898-passing-2-dimensional-array-function.html

То, к чему это сводится, это изменение определения вашей функции на:

void printboard(int a[][N], int m, int n);

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

printf("%c", a[i][j]);

на

printf("%d ", a[i][j]);

Я добавил пробел, чтобы числа выводились вместе при выводе на терминал.

Что касается анализа входных данных, это целая тема.Я бы предложил strtok разбить ваши строки, когда вы читаете их из файла.Затем вы будете использовать что-то вроде sscanf для хранения данных в массиве вашей платы.Смотрите эти ссылки:

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/ http://www.cplusplus.com/reference/clibrary/cstring/strtok/

0 голосов
/ 24 ноября 2011

Я просто предполагаю, что вы хотите, чтобы точки (.) Отображались, когда поле пустое, поэтому предварительно заполните массив доски.

char board[N][N]; // i changed it to char, was int but char is enough
memset(board, '.', sizeof(board));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...