从C中的文件填充2D数组

时间:2018-11-24 16:17:33

标签: c arrays

所以我有一个20 x 20的数组,并且全部填充为-1。 我也有一个input.txt,其中包含一些数字,例如:
    2,3
    5,6

如何填充数组,使array[0][0]成为2array[0][1]将是3array[1][0]将是5array[1][1]将是6,所有其他元素将是-1。

我已经尝试过使用fscanf的for循环,直到有新行,但是那行不通。

2 个答案:

答案 0 :(得分:0)

尝试使用“文件结尾”(eof),其中m和n是行和列

for (i = 0; i < m && !feof(input); i++)
  for (j = 0; j < n && !feof(input); j++)
  fscanf(input, "%f", &a[i][j]);

如果文件中还给出了数组的大小(m和n),请在前面加上一个if条件

if (!feof(input))
  fscanf(input, "%d %d", &m, &n);
for (i = 0; i < m && !feof(input); i++)
      for (j = 0; j < n && !feof(input); j++)
      fscanf(input, "%f", &a[i][j]);

答案 1 :(得分:0)

  

我已经尝试过使用fscanf的for循环,直到有新行,但是那行不通。

与OP prior question中一样,fscanf(in, "%d,%d\n", &x, &y)上的变化无法检测行尾。格式中的'\n'将匹配输入上的任何空白,包括'\n'' ''\t'

fscanf(..., "%d",...)的简单使用很容易失败,因为"%d"将消耗所有前导空白,而不会'\n'与其他空白之间进行区分。

  

如何填充数组...

尽管可以使用fscanf()解决此任务,但请考虑 fgets(),strtol()

最好的方法是使用fgets()到达:直到最后一个'\n'为止的所有字符。然后使用strtol()strtoll()等读取整数。

long整数和空格每个都需要合理地少于21个字符。为了适应额外的前导零间距,请使用预期大小的2倍。

#define CHAR_PER_NUMBER 21
#define NUM_PER_LINE 20
#define LINE_NUM 20
#define LINE_SIZE (NUM_PER_LINE * CHAR_PER_NUMBER * 2)

long array[LINE_NUM][NUM_PER_LINE];

// read data
for (int i = 0; i < LINE_NUM; i++) {
  char buf[LINE_SIZE + 1]; // +1: room for the appended the null character
  if (fgets(buf, sizeof buf, in) == NULL) {
    buf[0] = '\0';
  }
  // Now parse the line
  char *p = buf;
  for (int j = 0; j < NUM_PER_LINE; j++) {
    char *endptr;
    array[i][j] = strtol(p, &endptr, 10);
    if (p == endptr) {
      array[i][j] = -1; // no conversion  
    }
    p = endptr; // advance to the next number
  }
}

其他问题包括处理病理长行,超出long范围的值,I / O错误处理和效率详细信息。

输入应包含表示浮点数的文本,因此应保证每个值都具有更大的最大大小。