如何根据从文件中读取的字符确定数组的大小?

时间:2014-03-17 05:01:10

标签: c

我必须分配一个动态数组,我知道阵列上会有多少列,但我不知道有多少行,我只有一个.txt文件上的数字。我尝试了以下代码,但我不确定它是否可行:

int x = (int)fgetc(file)-48;

由于ascii值为0是48,我认为我需要从文件中转换字符,以便能够将其用作我的行号。

我假设我应该能够按照以下方式为2D阵列分配数组:

m = (int **)malloc(x*sizeof(int*));
for (i=0;i<x;i++)
{
    m[i] = (int*)malloc(10*sizeof(int));
}

我是对的吗?任何帮助都是非常好的。

3 个答案:

答案 0 :(得分:0)

您可以设计列表并动态插入行。

答案 1 :(得分:0)

我是否正确理解您的文件是

327            // number of lines
1 2 3          // line 1
33 44 55       // line 2 

...重复直到打印327行,所有行都有3个元素?请注意,换行符是可选的,可以是任何空格。

从C中的文本中读取数字的规范方法是使用scanf。 scanf使用像printf一样奇怪的格式字符串作为第一个参数。每个基本类型都有一个与之关联的字母,对于整数,或者更直观地说,是i。这些字母以%为前缀。因此,要读取整数,如果lines是一个包含行数的int,则会写scanf("%d", &lines);。 (为了便于阅读,请不要使用x。)

分配数组的方式是正确的(假设x保持行数,10表示已知行长度)。一个样式问题是10应该#defined为宏,以便您可以使用例如的malloc(LINE_LEN *的sizeof(int)的)。这有助于以后这个数字应该改变,并且你(在现实世界的程序中)在几个源文件中分散了对m的引用。

如果这只是一个小程序并且数组不是非常大并且不需要比函数调用更长寿(在main()的情况下,在任何情况下都可能足够长) ,最简单的方法是在C中使用可变大小的数组;如果您使用适度的现代编译器:

#define LINE_LEN 10
int lineCount;
scanf("%d", &lineCount);
int m[lineCount][LINE_LEN];
// fill from file

如果你用gcc编译,你可能需要指定&#34; -std = c99&#34;作为命令行选项。

答案 2 :(得分:0)

首先关闭fgetc()会返回一个整数,因此将其作为int转换将不执行任何操作。其次,您只能使用fgetc()一次读取一个整数,因此您将在x中使用1位数字。

您的数组分配看起来是正确的,但您也可以将列分配为堆栈中的int *数组,然后动态分配行为m [i] =(int *)malloc(x * sizeof(int)) ;从i = 0-> 9