C

时间:2015-08-05 20:26:20

标签: c arrays integer

我必须从C语言的文本文件中读取一个未定义的矩阵,我想逐行读取它,这样每一行都是一个整数数组。但我怎么知道一行的结尾,因为我不能使用“\ n”作为字符? 这是代码:

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"

using namespace System;

typedef struct
{
    int *v;
    int n;
}vector;



int main(array<System::String ^> ^args)
{
    vector *a;
    FILE* f;
    int n = 15;
    int i = 0;
    int j,k;
    if ((f = fopen("C:\\Users\\Mirelaa\\Documents\\visual studio 2013\\Projects\\MatriceNedefinita\\MatriceNedefinita\\Debug\\fisier2.in", "rt")) == NULL)
    {
        printf("Fisierul nu poate fi deschis!");
        exit(1);

    };

    a = (vector *)malloc(n * sizeof(vector));

    while (!feof(f))
    {
        a[i].v = (int*)malloc(n * sizeof(int));
        a[i].n = 0;
        //citeste rand
        //citesti fiecare element din rand
        j = 0;
        while (a[i].v[j] != '\0')// wrong!!

        {
            fscanf(f, "%d", &a[i].v[j]);
            j++;
            a[i].n = a[i].n + 1;
        }
        for (k = 0 ; k < a[i].n ; k++)
        {
            printf("%d", a[i].v[j]);
            printf("\n");
        }
        i++;
        if (i == n)
        {
            n = 2 * n;
            a = (vector *)realloc(a, n * sizeof(vector));
            a[i].v = (int *)realloc(a[i].v, n * sizeof(int));
        }
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

读取一行整数并保存在一个可变大小的数组中是一种方法。

fscanf(f, "%d",...的问题在于它首先读取空格并且代码丢失了'\n'的出现次数。代码需要通过其他方式查找。

但是不要打包main()中的所有代码,而应考虑辅助函数。以下C函数读取一个数字并返回NULL 1)内存不足,2)没有数据或转换失败而没有读取数字。否则返回vector。它不限于任何行长度。

typedef struct {
  int *v;
  size_t n;
} vector;

vector *Read_vector(vector *v1, FILE *inf) {
  v1->v = NULL;
  v1->n = 0;
  size_t size = 0;
  for (;;) {
    int number;
    int ch;
    // Check leading white-space for \n
    while (isspace(ch = fgetc(inf))) {
      if (ch == '\n') break;
    }
    if (ch == '\n' || ch == EOF) break;
    ungetc(ch, inf);
    if (1 != fscanf(inf, "%d", &number)) {
      break;
    }
    //  Is `v1` large enough?
    if (v1.n >= size) {
      size = size*2 + 1;
      vector nu;
      nu.v = realloc(v1->v, size * sizeof *nu.v);
      if (nu.v == NULL) {
        free(v1->v);
        v1->v = NULL;
        v1->n = 0;
        return NULL;
      }
      v1->v = nu.v;
    }
    v1.v[v1.n++] = number;
  }
  if (v1->n == 0) {
    return NULL;
  }
  return v1;
}

通过重复调用,可以获得一组向量。把它留给OP,因为它与上面非常类似。

注意:请避免使用while (!feof(f))

答案 1 :(得分:0)

我会用fgets读一行...(参见例如here

char *fgets(char *str, int n, FILE *stream) 

你可以将一行最多$ n $字符行读成一个字符串。

此方法为您提供了将每行单独加载到字符串的方法。

在好评后编辑

使用 strtok 分割字符串更容易,然后使用 atoi 将字符串的每个位转换为整数(而不是像我原来那样使用sscanf回答)。