我必须从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;
}
答案 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回答)。