C中整数行的结尾

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

#include "stdafx.h" #include "stdlib.h" #include "stdio.h" using namespace System; typedef struct { int *v; int n; }vector; int main(array ^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; } 

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

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))

我会用fgets阅读…(参见例如此处 )

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

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

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

好评后编辑

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