将数组插入二进制文件的函数

A function that inserts array into a binary file

我的任务是编写一个函数 unesi_niz,它允许用户输入实数数组(最多 100 个),其中输入以输入数字 -1 结尾。以这种方式输入的数组应作为 double 类型的值写入二进制文件 niz.bin。该文件不得包含字符串成员以外的任何内容(因此它不得包含输入的数字 -1)。

然后编写一个srednja_vrijednost函数计算niz.bin文件中数字的平均值并return计算它。如果文件不存在或为空,0 应该被 returned.

所以我是这样开始的:

#include <stdio.h>
#include <stdlib.h>
#define vel 100
int i = 0;
int j = 0;
void unesi_niz() {
  double pomocna;
  double niz[100];

  while (i != 100) {
    scanf("%lf", &pomocna);
    if (pomocna != -1) {
      niz[i] = pomocna;
      i++;
    } else
      break;
  }

  FILE *ulaz = fopen("niz.bin", "w");
  if (!ulaz) {
    printf("Greska pri otvaranju.\n"); //opening fault
  }
  for (j = 0; j < i; j++) {
    fwrite(niz, sizeof(double), j, ulaz);
  }

  fclose(ulaz);
}

double srednja_vrijednost() {
  double suma = 0;

  if (i == 0)
    return 0;
  FILE *ulaz = fopen("niz.bin", "r");
  if (!ulaz) {
    printf("Greska pri otvaranju.\n");//opening fault
    return 0;
  }

  double niz[100];
  fread(niz, sizeof(double), i, ulaz);
  int j;

  for (j = 0; j < i; j++) {
    suma += niz[j];
  }

  fclose(ulaz);
  return suma / i;
}

int main() {
  unesi_niz();
  double n=srednja_vrijednost();
  printf("%g\n", n);
  return 0;
}

我的代码有几个问题。第一个是函数 srednja_vrijednost 的错误 return 值,当我输入值 5 10 15 时,结果是 1.6667,这是胡说八道,然后是许多“Profiler 错误”,我的调试控制台说Error in line 56, main.c file: The program accesses a variable that is not initialized,但是我没有看到任何“禁止的操作”。

希望你们中的一些人能看到我做错了什么:)

您的代码在 unesi_niz 中的这些行失败:

  for (j = 0; j < i; j++) {
    fwrite(niz, sizeof(double), j, ulaz);
  }

fwrite 获取指向数据的指针、单个元素的大小(以字节为单位)以及此类元素的数量。这意味着您的代码每次都从第一个元素开始写入 j 个元素。您可能希望每次写入 1 个元素。或者更好的是,您想写入所有 i 个元素,因为 fwrite 允许您写入多个元素。

fwrite(nix, sizeof(double), i, ulaz);

顺便说一句,您的“srednja_vrijednost”逻辑会起作用,但这只是因为您已经知道当前进程中数组的大小(存储在i 中)。我不完全确定您要做什么,但我怀疑您希望即使在您的进程退出后也能够读回相同的文件。为此,您需要一些逻辑来查找数组的大小。您可以通过将长度也写入文件来执行此操作,或者(类似于输入)写入结尾 -1,或者通过计算 file size.

来计算大小