Potřeboval bych poradit, jak převést ASCI čísla, kterámám uloženo v paměti, nejsou ukončeno \0 !!! např. " 80766". Znám jeho délku a pozici prvního znaku v paměti. Jde mi funkci, kterou pak budu volat v cyklu.
int ASCI_na_cislo(int ASCIdelka, int ASCIpozice)
{
return stoi(reinterpret_cast<string*>(adresa));
}
adresa je 64bit adresa na začátek paměti ke které je potřeba přičíst pozici prvního znaku (ASCIpozice).
Příklad volání funkce z Main:
x = ASCI_na_cislo(8, 0)
Případně provést koverzi pomocí stringstream class nebo sscanf() ?
Jedna možnost je doplnit za zadaný řetězec ukončovací znak (ne vždy lze takto upravit obsah paměti), druhá možnost alokovat paměť aby se tam vešel řetězec vč. ukončovacího znaku a zkopírovat. Do třetice vytvořit proměnnou, nazvěme ji num a tu nastavit na nulu. Pak v každé iteraci cyklu num vynásobit 10 a přičíst cifru vyjádřenou přečteným znakem. Počet iterací cyklu je dán počtem znaků. Jdou tak i vynechat bílé znaky před číslem. Cyklus lze ukončit i v okamžiku, kdy se narazí na nečíselný znak.
scanf by mohl mít problém s chybějícím koncem řetězce.
A ta funkce bude mit prototyp int Prevod(char* misto, int pocet); Protože "adresa na začátek paměti" je ukazatel.
Int Prevod(__int64 ASCII_adresa, int ASCII_delka, int ASCI_pozice)
{
*(BYTE *)(ASCII_adresa + ASCI_pozice + ASCII_delka) = 0x00;
return atoi(reinterpret_cast<CHAR*>(ASCII_adresa + ASCI_pozice));
}
Cyklus pro úpravu 50 mil. řádků:
for (int i = 0; i < radku; i++) //Cyklus pro úpravu dat
{
misto = adresa + (i * 125); //Načteme ID
x = Prevod(misto, 8, 0);
*(DWORD *)(misto + 56) = x; //a uložíme na pozici 56
}