从文件中读取数组,直到遇到0

时间:2015-03-26 22:42:03

标签: c file

元素的数组数量未知

文件输入是: 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,因此无效;

3 个答案:

答案 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;
}