Получить числа на четных позициях из файла Переполнение стека

Я написал эту программу, которая должна записывать некоторые числа с плавающей запятой в двоичный файл, затем читать его и отображать только числа, расположенные на четных позициях. Теперь мне трудно понять, как проверить положение и показать, что там. Может ли кто-нибудь, пожалуйста, взглянуть на код и сказать мне, если есть какие-либо ошибки и как я могу отобразить что-то таким образом? Я также немного озадачен тем, что именно меняет поведение 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));
}
}

0

Решение

Ошибок, которые я заметил на первый взгляд, может быть больше:

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>, Сама строка не является переносимой, вы должны обрабатывать это по-другому, см. Комментарии выше.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]