从txt.file读取数据并打印出其2D数组内容

时间:2011-11-23 22:01:04

标签: c arrays file

我需要一些帮助,我想打印出文件中的信息(字符)

我决定使用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数组,因为我需要进一步研究它,以便在一个名为Peg Solitaire的游戏中移动'0'。

2 个答案:

答案 0 :(得分:1)

函数中的参数名称必须是唯一的。所以你的printboard函数不能有两个“n”参数,你必须改变一个名字(“m”或其他东西)。此外,由于您正在打印n x n矩阵并且已经通过预处理器定义了“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/

答案 1 :(得分:0)

我只是在猜测你想要在字段为空时显示点(。) 所以预填充你的电路板阵列。

char board[N][N]; // i changed it to char, was int but char is enough
memset(board, '.', sizeof(board));