将数组插入二进制文件的函数
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.
来计算大小
我的任务是编写一个函数 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.