2017-04-14 36 views
2

我有一个文件,我必须读取一些数字并将它们放入数组中。唯一的问题是我不知道如何找到它的大小。我给了数组的最大大小,但数字不能完全填充数组。我尝试了许多不同的方法来使其工作,但它并没有从文件中读取正确的值。有没有其他的方式来做到这一点没有sizeof?从文件中检索数组并找到它的大小C

#include<stdio.h> 

#define MAX_NUMBER 25 
int main(void) 
{ 
int test[]; 
int size; 

FILE* sp_input;  
int i; 
sp_input = fopen("a20.dat", "r"); 

if (sp_input == NULL) 
    printf("\nUnable to open the file a20.dat\n"); 
else 
    { 
    while(fscanf(sp_input, "%d", &test[i])!=EOF) 
    { 
    size=sizeof(test)/sizeof(test[0]); 
    } 

    for(i = 0; i < size; i++) 

    printf("\na[%d]=%d has a size of %d\n", i,test[i],size); 
    fclose(sp_input);  
    } 

    return 0; 
} 
+0

“i”未初始化,永远不会改变while循环中的值。 –

+0

如果'size'应该是数组中有多少个数字,那么为什么不从0开始并为每个读取的数字增加? – Dmitri

+0

此外,您还需要给出'test'的元素数量,例如。 'int test [MAX_NUMBER];' - 该数组总是会有最大数量的元素,但是您可以通过'size'跟踪您实际使用的元素数量。 – Dmitri

回答

2

如果你每次成功地做了fscanf时间增加i,它将作为项目阅读次数的计数。

i = 0; 

while (fscanf(sp_input, "%d", &test[i]) == 1) { 
    i = i + 1; 
} 

// Now, i is the number of items in the list, and test[0] .. test[i-1] 
// are the items. 

编辑:作为@chux指出,在这种情况下,最好到比较1,项目的预期数量进行扫描,在每次调用。如果提供虚假输入(非数字),仍然存在问题,您应该停止。

+1

较小的'fscanf(sp_input,“%d”,&test [i])== 1'更习惯于循环,只要结果如预期的那样她比其他可能的'fscanf()'结果中的1个要好。当然在这种情况下,预期只有'EOF'或1,但这个公理适用于更复杂的扫描。 – chux

1

定义最大大小数组并继续循环。

文件输入不需要填充该数组,只是填充它,因为它可以。保持跟踪i,使用了多少个test[],并确保不要过度填充阵列。

#define MAX_NUMBER 25 
int test[MAX_NUMBER]; 

FILE* sp_input = fopen("a20.dat", "r"); 
... 

// Use `size_t` for array indexing  
size_t i; 
// do not read too many `int`  
for (i=0; i<MAX_NUMBER; i++) { 
    if (fscanf(sp_input, "%d", &test[i]) != 1) { 
    break; 
    } 
    printf("test[%zu]=%d\n", i, test[i]); 
}