Struktury - qsort, fwrite

0

Nie wiem jak zrobić instrukcję aby mając np. wektro [ 2 ,4 ,0] ułożył się w ten sposób [ 0, 2, 4]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}
 
int main(int argc, char *argv[]) {
     
    FILE* wektory;
    if((wektory = fopen("wektory.BIN","w+b"))==NULL)
    puts("error");
     
    srand(time(0));
     
    typedef struct wektor{
    float x,y,z;
    } wektors; 
     
    int i;
    wektors first[20];
     
    for(i=0;i<20;++i){ 
        first[i].x =  1 + rand() % 49;
        first[i].y =  1 + rand() % 49;
        first[i].z =  1 + rand() % 49;
    }
 
    for(i=0;i<20;++i)
    fwrite(&first[i],sizeof(wektors), 1,wektory); // 
    fseek(wektory,0,0);
    for(i=0;i<20;++i)
    fread(&first[i],sizeof(wektors),1,wektory);
  
    for(i=0;i<20;++i)
    qsort(&first[i],1,sizeof(wektors),cmpfunc);  // <<---- tu o tutaj 
     
    for(i=0;i<20;++i){
    printf("%.2f\t",first[i].x);
    printf("%.2f\t",first[i].y);
    printf("%.2f\t",first[i].z);
    puts("\n\n");
    }
     
return 0;
}

może mi ktos wytlumaczyc dlaczego musze podac jako 3 argument liczbę 1 do funkcji fwrite ," liczba elementow ktora ma byc zapsiana do zrodla"
czyli nie rozumiem, i dlaczego jak dam 2 to rozmiar pliku zwieksza sie 2x, dlaczego wtedy nie nadpisuje się, tylko dopisuje gdzieś( no właśnie nie wiem gdzie, dlaej w pliku? )

0

Kodu nie komentuję, bo sam chyba nie wiesz co robisz.

Co do samego ułożenia wektora w posortowany sposób to nie wiem czy qsort jest tu potrzebny (no bo to są tylko 3 zmienne do ewentualnego przeniesienia), ale jeśli już to:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	float x, y, z;
} wektor_t;

int cmpfunc(const void *a, const void *b)
{
	float _a = *(float *)a;
	float _b = *(float *)b;
	if(_a < _b) return -1;
	else if(_a == _b) return 0;
	else return 1;
}

int main(int argc, char *argv[])
{
	wektor_t wektor;
	wektor.x = 7.f;
	wektor.y = 1.f;
	wektor.z = 6.f;
	qsort(&wektor, sizeof(wektor_t)/sizeof(float), sizeof(float), cmpfunc);
	printf("%f %f %f\n", wektor.x, wektor.y, wektor.z);
	return 0;
}
0

A dlaczego od razu nie zapiszesz 20 elementów, tylko w pętli zapisujesz po 1 elemencie? Po to masz ten 3 argument właśnie. W pierwszym podajesz wskaźnik na tablicę elementów do zapisu/odczytu, w drugim rozmiar elementu, a w trzecim ich ilość.

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

Czego tutaj nie rozumiesz?

0

no ale mistrzu ja mam tablice co nie, i wpisuje do każdego elemntu tablicy &tab[i], jeśli dam count = 20, to jak wpisze do tablicy?

0

o to ci chodziło?

 wektors* wsk=&first[0];
 
   // for(i=0;i<20;++i)
    fwrite(wsk++,sizeof(wektors), 20,wektory); // 
    fseek(wektory,0,0);
1

Ale po co tak komplikujesz? Nazwa tablicy jest wskaźnikiem na jej pierwszy element. Poczytaj o tablicach i wskaźnikach i ich podobieństwie.
Może ten przykład Ci pomoże zrozumieć:

#include <stdio.h>

int main() {
  int tab[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
  int *ptab = &tab[0];

  printf("Adres pierwszego elementu: %p\n", &tab[0]);
  printf("Adres tablicy: %p\n", tab);
  printf("Wskaźnik wskazuje na: %p\n", ptab);

  printf("Notacja tablicowa vs wskaźnikowa (Adresy):\n");
  for (size_t i = 0; i < sizeof(tab) / sizeof (tab[0]); ++i){
    printf("Element [%lu]: %p : %p\n", i, &tab[i], tab + i);
  }

  printf("Notacja tablicowa vs wskaźnikowa (Wartości): \n");
  for (size_t i = 0; i < sizeof(tab) / sizeof (tab[0]); ++i){
    printf("Element [%lu]: %d : %d\n", i, tab[i], *(tab + i));
  }

  return 0;
}

Z powyższego wynika:

fwrite(first, sizeof (wektor), 20, wektory);

1 użytkowników online, w tym zalogowanych: 0, gości: 1