【问题标题】:Matrix Input from file separated by comma in C into 2D将 C 中用逗号分隔的文件的矩阵输入转换为 2D
【发布时间】:2016-06-17 22:11:21
【问题描述】:

我目前正在将文件中的矩阵输入转换为二维数组。鉴于喜欢,

  • 2,3,4

    1,2,3

    4,5,6

  • 3,5,6,3,1

    2,3,6,7,8

    8,7,6,5,4

    3,4,6,7,8

矩阵的大小可以变化。我可以使用我的代码(如下所示)为 3*3 矩阵执行此操作。我应该进行哪些更改才能输入任何大小的矩阵,例如 7*7 或 5*5 ?

#include <stdio.h>

#define MAXB 32
#define MAXL 18
#define MAXD 3

int main(void)
{
int i = 0,temp,n,m,j=0;
int numlines = 0;
char buf[MAXB] = {0},c;
char lines[MAXL][MAXD];

FILE *fp = fopen("num.txt", "r");

if (fp == 0)
{
   fprintf(stderr, "failed to open inputs/control.txt\n");
   return 1;
}

while (i < MAXL && fgets (buf, MAXB - 1, fp))
{
    if (sscanf (buf, "%hhd, %hhd, %hhd", &lines[i][0], &lines[i][1], &lines[i][2]) == 3)

        i++;
}

fclose(fp);

numlines = i;

for (i = 0; i < numlines; i++)
    for (j = 0; j < MAXD; j++)
        printf (" line[%2d][%2d] : %hhd\n", i, j, lines[i][j]);

printf ("\n");

return 0;
}

【问题讨论】:

  • 您是否尝试将#define MAXD 3 增加到更大的数字?也许代码可以正常工作,但由于硬编码的大小而被限制为 3。
  • @Shark 是的,这是针对 3*3 矩阵的。因此,MAXD 为 3。由于我想要完全由用户定义的 5*5 或 9*9 等各种大小的输入,在文本文件中,此方法不适用于我。
  • 动态分配char** lines,相当于lines[rows][columns]
  • @Shark 是的,我可以这样做,但是在我不知道一行中元素的数量的情况下,我该怎么做呢?不会是无限循环吗?
  • 你刚才不是说"Since I want various size of inputs like 5*5 or 9*9 which is totally user defined, inside the text file"吗?因此,您甚至在开始阅读之前就知道元素的数量。

标签: c arrays matrix arraylist multidimensional-array


【解决方案1】:

您可以将 while 循环替换为如下简单的内容:

while (fscanf(fp, "%hhd", &lines[i][k]) > 0) {

    //check to see if the next character is a comma
    fscanf(fp, "%c", &check);

    //if it is a comma, go to the next char, else go to the next line
    if (check == ',') {k++;} else {i++; k=0;}

}

当然,您必须更改一些常量,例如 MAXD 以获得更大的尺寸。

此外,对于此代码,您需要在 while 循环之前创建一个整数 k 和一个字符 check

【讨论】:

  • 所以,我的代码应该是.. while (fscanf(fp, "%hhd", &lines[i][k]) > 0) { scanf("%d",&line[i] [k]); //检查下一个字符是否为逗号 fscanf(fp, "%c", &check); //如果是逗号,跳到下一个字符,否则跳到下一行 if (check == ',') {k++;} else {i++; k=0;} }
  • 1) 用我写的替换你的while 循环。 2) 将您的 MAXD 值更改为更大的值。 3) 在int main(void) 之后的第一行添加int k=0;。 4) 同时添加char check;。它应该可以工作。
  • 好的,这里的问题是当我将 MAXD 更改为大的时候,列数也会增加。比如说MAXD=50。我在第 [3][0] 行到 [3][49] 行的第 4 行有值。因此,我认为我需要确切的列数。我该怎么做?
  • 一个简单的解决方案是使用scanf 询问用户预期的列数。然后将数组初始化为正确的大小。但通常不建议这样做。问题是,您真的需要数组具有确切的大小吗?如果您想很好地打印数组,您可以循环遍历正确数量的元素(例如,对于 8x8 矩阵,每行只需循环 8 次并忽略其余的)。为此,您可以创建一个新的int 并在while.. 循环的else.. 条件中为其分配k 的值(在k 设置为0 之前)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多