Avatar billede needs Nybegynder
13. maj 2003 - 23:48 Der er 16 kommentarer og
1 løsning

Int_64 - filer og %

Har nogen en god idé til hvordan man i praksis gemmer int_64 variabler i en fil [hurtigt]? Der skal gemmes flere mio. og nok oz milliarter af store tal som skal kunne loades ind igen. Hvordan overloader man % så den kan bruges med int_64?
Svar skal kunne bruges i Visual c++ 6.0 sp5 og .net
Avatar billede bertelbrander Novice
13. maj 2003 - 23:57 #1
Et skud fra hoften:
Man gemmer den med fwrite(&my_int_64, sizeof(int_64), 1, my_file);
Og læser den tilbage med fread(&my_int_64, sizeof(int_64), 1, my_file);

Hvorfor tror du det er nødvendigt at overloade %, så vidt jeg ved virker det uden problemer som det er.
Avatar billede arne_v Ekspert
14. maj 2003 - 06:03 #2
bertel>

Prøv selv med:

#include <stdio.h>

int main()
{
  _int64 a = 1234567890L;
  a = 1000 * a;
  printf("%ld\n",a);
}


det virker ikke !
Avatar billede arne_v Ekspert
14. maj 2003 - 06:05 #3
needs>

Så vidt jeg er der *ikke* noge printf specified til __int64.

Du vil blive nødt til at lave din egen lille konverterings rutine
__int64 -> C string (char array).

Det er heller ikke svært.
Avatar billede arne_v Ekspert
14. maj 2003 - 06:26 #4
#include <stdio.h>

static char buf[26];

char *qtoa(_int64 v)
{
  _int64 tmp;
  int ix,i;
  char c;
  if(v==0) {
      strcpy(buf,"0");
      return buf;
  }
  ix = 0;
  tmp = (v > 0) ? v : -v;
  while(tmp > 0) {
      buf[ix] = '0' + tmp % 10;
      ix++;
      tmp = tmp / 10;
  }
  if(v<0) {
      buf[ix]='-';
      ix++;
  }
  for(i=0;i<ix/2;i++) {
      c=buf[i];
      buf[i]=buf[ix-i-1];
      buf[ix-i-1]=c;
  }
  buf[ix]='\0';
  return buf;
}


int main()
{
  _int64 a = 1234567890L;
  a = 1000 * a;
  printf("%ld\n",a);
  printf("%s\n",qtoa(a));
  a = -1 * a;
  printf("%ld\n",a);
  printf("%s\n",qtoa(a));
}
Avatar billede soreno Praktikant
14. maj 2003 - 09:25 #5
MinGW har denne funktion:
_ui64toa(int64tal, buffer, 10);
_i64toa(int64tal, buffer, 10);

Jeg mener også MSVC++ har den (funktionene ligger tilsyneladende i MSVCRT.dll'en) - jeg er dog ikke klar over hvilke include den ligge i ?

I MinGW ligger den i stdlib.h
Avatar billede olennert Nybegynder
14. maj 2003 - 09:52 #6
Jeg vil foreslå

#include <inttypes.h>
#include <stdio.h>

int64_t my_int64;

// Her er noget kode som sætter my_int64 til et eller andet
printf("Her er værdien: my_int64 = %"PRId64"\n", my_int64);

inttypes.h findes i Single Unix Specification v2, og så vidt jeg husker også i den nyeste C-standard (C99?)
Avatar billede olennert Nybegynder
14. maj 2003 - 09:54 #7
Ups, jeg læste svarene, ikke spørgsmålet (eller rettere, ikke spørgsmålet ordentligt). Hvis du vil have performance, så undgå printf-lignende udskrivning, og brug fwrite/fread direkte.

Hvis du for alvor vil have performance, så pak dine 64-bit heltal sammen i større hukommelsesstrukturer, og skriv så strukturen i blokke af eksempelvis 1K eller mere.
Avatar billede needs Nybegynder
14. maj 2003 - 13:56 #8
olennert>> hvordan får jeg skrevet dem ind i struktur?(gerne et kode eks. på load og save til fil.)?
TIL ALLE !!! >> hvad med % har nogen en idé??? - gerne noget der er optimeret...

Jeg skal det til et forsknings projekt i primtal. Har lavet et program der går op til unsigned long (MS's version af int unsigned long) grænse... int_64 ser udtil at være det bedste valg for en heltals variabel der kan går op til eller over 10 i 20
Avatar billede needs Nybegynder
14. maj 2003 - 13:56 #9
Eller hvad???
Avatar billede arne_v Ekspert
14. maj 2003 - 14:04 #10
Mener du ikke % som i % format specifier ?

Hvis du mener % som i modulus så virker den fint for __int64.

(se f.eks. mit kode eksempel)

Du kan ikke overloade operatorer på simple data typer.

__in64 kan ikke klare 10^20. Men rimeligt tæt på.

Hvis du skal arbejde seriøst med prim tal skal du have fat
i et library der kan regne med meget meget meget større hel tal.
Avatar billede needs Nybegynder
14. maj 2003 - 14:11 #11
arne_v>> kender du et godt lib?
Avatar billede needs Nybegynder
14. maj 2003 - 14:23 #12
jeg mente % som i modulus... undskyld min uklarhed :-)
Avatar billede arne_v Ekspert
14. maj 2003 - 14:24 #13
Avatar billede arne_v Ekspert
14. maj 2003 - 14:27 #14
Jeg har selv engang lavet noget.

Og der var faktisk en der spurgte efter det på Ekseprten for nyligt.
Det kan hentes på:
  http://80.199.19.48/arne/eksperten/big/big.zip

VIGTIGT: TIL SERIØST BRUG - BRUG GNU OG IKKE MIT GAMLE HJEMMESTRIKKEDE KODE.
Avatar billede needs Nybegynder
14. maj 2003 - 14:42 #15
tak
Avatar billede bertelbrander Novice
14. maj 2003 - 23:21 #16
Jeg ved godt at man ikke kan udskrive en int64 med %ld i printf. I visual C++ bruges "%I64d".
Avatar billede arne_v Ekspert
14. maj 2003 - 23:24 #17
Jeg havde også misforstået hvad spørgsmålet gik på.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester