元素的数组数量未知
文件输入是: 2 3 4 5 8 0
阵列将具有: 2 3 4 5 8
int read(FILE *in,int a[])
{
int i = 0;
int temp;
while(fscanf(in, "%d", &temp) != EOF)
{
a[i++] = temp;
}
return i;
}
此代码返回0,因此无效;
答案 0 :(得分:2)
在你的for循环中,你正在阅读a[i]
,然后再访问它。但是,如果您使用fscanf,最好使用EOF检查是否到达文件末尾。我发现使用这种方法很优雅:
int read(FILE *in,int a[])
{
int i = 0;
int temp;
while(fscanf(in, "%d", &temp) != EOF){
a[i++] = temp;
}
return i;
}
fscanf返回的EOF值为-1而不是0.如果输入失败,在成功读取任何数据之前,将返回EOF。
编辑:
虽然这可能是一个很好的方法,正如Jonathan在他的评论中指出的那样,如果你的文本文件中有文字,fscanf永远不会达到EOF,不断增加i
并最终导致程序崩溃。
这是解决问题的最佳方法:
while(fscanf(in, "%d", &temp) == 1){
}
检查正确的转换次数(本例中为一个)可确保正确退出循环。
答案 1 :(得分:1)
非常简单
int readDataFromFile(FILE *in, int *a, size_t size)
{
int i;
i = 0;
while ((i < size) && (fscanf(in, "%d", &a[i]) == 1) && (a[i] != 0))
{
i += 1;
}
return (a[i] == 0) ? i : SOME_INVALID_VALUE_LIKE_MINUS_1;
}
现在假设您的文件路径为/myfile/path/file.data
,那么main()
可能如下所示
int main(void)
{
int array[100];
int result;
size_t size;
FILE *file;
file = fopen("/myfile/path/file.data", "r");
if (file == NULL)
{
fprintf(stderr, "cannot open the file for reading\n");
return -1;
}
size = sizeof(array) / sizeof(array[0]);
result = readDataFromFile(file, array, size);
/* do something with `result' and `array' */
return 0;
}
您的代码非常不安全,因为您没有绑定检查,也不会检查是否已读取该值。
此外,不要将该名称用于某个功能,首先它是一个标准功能,而且它不能很好地描述该功能的用途。
答案 2 :(得分:1)
您的代码失败的原因是您在写入之前从a[i]
读取。因此,如果a[i]
中的零为零,则在您的文件中遇到零之前,您的循环结束。这是幸运的情况,如果你不幸,a[]
的所有有效元素都是非零的,并且你有超出范围的数组访问权。
int read(FILE *in,int a[])
{
int i = 0;
int temp = 0;
do
{
fscanf(in,"%d ",&temp);
if (!temp)
break;
a[i++] = temp;
temp = 0;
} while (1);
return i;
}