如何读取文本文件C中矩阵的大小

如何读取文本文件C中矩阵的大小,c,matrix,C,Matrix,我在文本文件中有以下格式的矩阵: 1 2 4 2 5 6 7 8 9 5 6 7 8 6 7 8 9 7 8 9 0 这只是两个任意矩阵,它们之间用一条空线隔开。我知道如何在C语言中将文本文件读入多维数组,但对于如何获得给定格式的矩阵的行数和列数,我有点困惑。它们每次可以有不同的长度。 如何推断行数和列数 如果您无法事先修改文件格式以包含大小,则在找到空行之前,您别无选择,只能读取行。类似地,您需要至少完整地解析一行,以了解矩阵有多少列 然后,您有两种选择来读取矩阵:要么将行读入具有足够字节

我在文本文件中有以下格式的矩阵:

1 2 4
2 5 6
7 8 9

5 6 7 8
6 7 8 9
7 8 9 0
这只是两个任意矩阵,它们之间用一条空线隔开。我知道如何在C语言中将文本文件读入多维数组,但对于如何获得给定格式的矩阵的行数和列数,我有点困惑。它们每次可以有不同的长度。
如何推断行数和列数

如果您无法事先修改文件格式以包含大小,则在找到空行之前,您别无选择,只能读取行。类似地,您需要至少完整地解析一行,以了解矩阵有多少列


然后,您有两种选择来读取矩阵:要么将行读入具有足够字节的缓冲区以覆盖最大的矩阵,要么返回矩阵的第一行并根据刚刚获得的大小信息分配矩阵数组。

这可能不是一个优雅的解决方案,但它解决了问题

实现您自己的特殊函数,从 屏幕。一旦它注意到行尾,
\n
,将其解释为 一行。大概是这样的:

int readInteger(char *endCharacter) {
  char input;
  int integer;
  integer = 0;
  input = getchar();
  while (input != ' ' && input != '\n') {
    integer += (int)input - '0';
    integer *= 10;
    input = getchar();
  }
  *endCharacter = input;
  return integer;
}

int *integerRowFromInput() {
  int *row;
  int size;
  char endCharacter;
  row = malloc(sizeof(int));
  row[0] = readInteger(&endCharacter);
  size = 1;
  while (endCharacter != '\n') {
    size++;
    row = realloc(size * sizeof(int));
    row[size - 1] = readInteger(&endCharacter);
  }
  return row;
}
当然,此代码需要修改以供进一步使用, 但这可能是一种获取输入的方法 在没有指定尺寸的情况下
其中的矩阵为。

。。。或者使用
realloc()
和friends作为矩阵,随着读取的行数越来越多,矩阵会随着需要而增长。因此,每当您得到一行不是空行的行时,您宁愿调用
realloc
?听起来性能很差。也许重新分配比从磁盘读取快?无论如何,您可以使用通常的策略,即在内存较短时将分配的内存加倍(并在末尾删除未使用的行),以最小化对
realloc()
的调用。空格是否分隔两个矩阵?不,它们不必是方矩阵,是的,只有一条空行分隔这两个矩阵matrices@Sam,你必须用你所拥有的,当然现在还不清楚你到底在做什么,但也许这会有助于你认识到你可以逐行将输入文件读入内存,分析这些行,并对它们采取适当的行动。还有其他方法可以解决这个问题,但显然,您不能使用依赖于提前知道数组维度的技术,例如您可能已经熟悉的技术。