【问题标题】:Read data from a txt.file and print out its 2D array contents从 txt.file 读取数据并打印出其二维数组内容
【发布时间】:2011-11-23 22:01:04
【问题描述】:

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

我决定使用二维数组,因为数据看起来像这样

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 数组一起使用,因为我需要进一步处理它以在名为 Peg Solitaire 的游戏中移动“0”。

【问题讨论】:

  • 尽管您的打印板方法中有 2 个未使用的同名参数,但您能否更准确地了解错误/预期?
  • 我假设您指的是 int n;在打印板函数中出现两次
  • 这真是太多的代码了。将来,将其缩减为一个最小的示例。在此过程中,您可能会自己发现错误。
  • 我假设您指的是 int n;在打印板函数中出现两次,问题出在编译器上,它给了我以下错误:重新定义参数 n sol1.c:7:注意:以前的 n 定义在这里是 sol1.c:在函数 main:sol1。 c:40:警告:从不兼容的指针类型 sol1.c:7 传递 printboarb 的参数 1:注意:预期的 int * 但参数的类型为 int ()[5] sol1.c:在顶部级别:sol1.c:45:错误:参数 n 的重新定义 sol1.c:45:注意:以前的 n 定义在这里我真的不知道如何解决这个问题

标签: c arrays file


【解决方案1】:

函数中的参数名称必须是唯一的。因此,您的打印板函数不能有两个“n”参数,您必须更改一个名称(更改为“m”或其他名称)。此外,由于您正在打印 n x n 矩阵并且您已经通过预处理器定义了“N”,您甚至需要这些参数吗? :)

数组(打印板的第一个参数)的传递有点棘手,需要一些关于指针和内存如何工作的知识。请参阅此处的讨论:

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/

【讨论】:

  • 我在没有两个参数和 N #defined 的情况下进行了实验,它似乎可以正确编译,但是现在当我在现在的函数中使用“%c”时,我似乎正在从缓冲区中打印出来void printboard(int a[][N]) 和 ascii 代码,当使用“%d”时,我会查看你的链接,不过谢谢
【解决方案2】:

我只是在这里猜测您希望在字段为空时显示点 (.) 所以预填充你的板数组。

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

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多