Я написал эту программу, которая должна записывать некоторые числа с плавающей запятой в двоичный файл, затем читать его и отображать только числа, расположенные на четных позициях. Теперь мне трудно понять, как проверить положение и показать, что там. Может ли кто-нибудь, пожалуйста, взглянуть на код и сказать мне, если есть какие-либо ошибки и как я могу отобразить что-то таким образом? Я также немного озадачен тем, что именно меняет поведение ftell, fgetpos и т. Д., Когда они используются в двоичных файлах. Любой ответ будет наиболее ценным. Вот код:
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <string>
void read(float *p,int n);
void main()
{
int n;
float *p,nr;
char name[20];
fpos_t poz;
printf("How many numbers would you like to have in your array?\n");
scanf("%d",&n);
if(!(p=(float*)malloc(n*sizeof(float))))
{
printf("Allocation unsuccessful!\n");
return;
}
read(p,n);
printf("Give the name of the binary file\n");
scanf("%s",name);
FILE *f;
if((f=fopen(name,"w+b"))==NULL)
{
printf("The file could not be reached for writing\n");
return;
}
for(int i=0; i<n; i++)
{
fwrite((p+i),sizeof(float),1,f);
fclose(f);
}
if((f=fopen(name,"rb"))==NULL)
{
printf("The file could not be opened:\n");
return;
}
printf("The numbers at positions 0,3,6 etc. are:\n");
while ((fread(&nr,sizeof(float),1,f)==1))
{
poz=ftell(f);
if((poz%2)==0)
{
printf("%f",nr);
}
}
fclose(f);
if(p)
free(p);
system("pause");
}
void read(float *p,int n)
{
printf("Introduce the series of numbers:\n");
for(int i=0; i<n; i++)
{
printf("Give the number %d:",i+1);
scanf("%f",(p+i));
}
}
Ошибок, которые я заметил на первый взгляд, может быть больше:
void main()
main
должен вернуться int
, Список параметров должен быть void
, Ваш компилятор принимает вашу версию, вероятно, тем не менее:
int main(void)
Следующая проблема:
for(int i=0; i<n; i++)
{
fwrite((p+i),sizeof(float),1,f);
fclose(f);
}
Вы закрываете файл после первой итерации, а затем снова пытаетесь записать. Вы должны закрыть файл, когда вы закончите не после первой записи:
for(int i=0; i<n; i++)
{
fwrite((p+i),sizeof(float),1,f);
}
fclose(f);
Эта часть не делает то, что вы ожидаете:
poz=ftell(f);
if((poz%2)==0)
{
printf("%f",nr);
}
ftell
возвращает позицию в байтах. каждый float
занимает обычно 4 байта. Так что на данный момент положение всегда будет четным. Вы хотите проверить, делится ли оно на 8 или лучше в два раза больше float
:
poz=ftell(f);
if(( poz % (2*sizeof(float)) == 0)
{
printf("%f",nr);
}
Однако было бы гораздо более практичным использовать вместо этого счетчик:
for(int poz=0; fread(&nr,sizeof(float),1,f)==1; poz++)
{
if((poz%2)==0)
{
printf("%f",nr);
}
}
Также это должен быть C или C ++? Код выглядит как C, но вы пометили его как C ++, также это будет неправильно в C: #include <string>
должно быть #include <string.h>
,
Использовать system("pause");
вам нужно #include <stdlib.h>
, Сама строка не является переносимой, вы должны обрабатывать это по-другому, см. Комментарии выше.
Других решений пока нет …