从输入文件获取整数的最佳方法

时间:2019-05-06 11:07:46

标签: c

我正在尝试将以下形式的输入文件放入数组中。

4
10
1 2 
20 3 19

其中4(第一个数字)是双向完全连接图中的节点数。

和以下数字是节点之间的权重。

我最初尝试使用:

 ch = fgetc(fp)

获取节点数,然后使用它分配正确大小的数组,以使用fscanf获取文件中的其余数字。但是,这将不起作用,因为第一个数字可能会超过1位数字。

我的目标是拥有一个数组:

intputnums = {10, 1, 2, 20, 3, 19}

然后可以用来创建邻接矩阵。我已经创建并填充了此矩阵。我只是在努力获取“ intputnums”数组。

当前代码:

int main(int argc, char* argv[]){
  char* fileName = argv[1];

  FILE* fp;
  fp = fopen(fileName, "r");

  int ch;
  ch = fgetc(fp);
  int size = ch - 48;

  int farraySize = (((float)size-1)/2)*((float)size);
  int iarraySize = (int)farraySize;
  int output[iarraySize];

  ch = fgetc(fp);

  for(int i = 0; i < iarraySize; i++){
    fscanf(fp, "%d", &output[i]);
  }

  return 0;
}

1 个答案:

答案 0 :(得分:2)

具有动态分配的示例代码:

#include <stddef.h>  // size_t
#include <stdlib.h>  // malloc(), realloc(), free(), EXIT_FAILURE
#include <stdio.h>   // fopen(), fclose, fscanf(), fprintf(), printf(), putchar()

int main(int argc, char **argv)
{
    if (argc != 2) {
        printf("Usage: %s [filename]\n\n", argv[0]);
        return EXIT_SUCCESS;
    }

    char const *filename = argv[1];
    FILE *input = fopen(filename, "r");
    if (!filename) {
        fprintf(stderr, "Couldn't open \"%s\" for reading. :(\n\n", filename);
        return EXIT_FAILURE;
    }

    int num_nodes = 0;
    if (fscanf(input, "%d", &num_nodes) != 1) {
        fprintf(stderr, "Couldn't read number of nodes from \"%s\". :(\n\n", filename);
        fclose(input);
        return EXIT_FAILURE;
    }

    size_t buffer_size = 0;
    size_t num_values = 0;
    int *inputnums = NULL;
    for (int value; fscanf(input, "%d", &value) == 1; ++num_values) {
        if (num_values == buffer_size) {
            buffer_size = buffer_size ? buffer_size * 2 : 10;
            int *temp = realloc(inputnums, buffer_size * sizeof *inputnums);
            if (!temp) {
                fputs("Not enough memory. :(\n\n", stderr);
                free(inputnums);
                fclose(input);
                return EXIT_FAILURE;
            }

            inputnums = temp;           
        }
        inputnums[num_values] = value;
    }

    printf("Number of nodes: %d\nNumber of values: %zu\nValues:\n", num_nodes, num_values);
    for (size_t i = 0; i < num_values; ++i)
        printf("%d ", inputnums[i]);
    putchar('\n');

    free(inputnums);
    fclose(input);
}