i dati sono memorizzati nel seguente modo : "nome-eta" dove il campo nome è grande 20 caratteri e il campo eta 2 caratteri
<?php
/*
CLAUDIO CARDINALE 4AI
effettuare le seguenti operazioni su un file :
- creazione
- ordinamento
- ricerca
i dati sono memorizzati nel seguente modo : "nome-eta" dove il campo nome è grande 20 caratteri e il campo eta 2 caratteri
*/
print "1) creazione file\n2) ordina prima versione\n3) ordina seconda versione\n4) ricerca\nscelta : ";
fscanf(STDIN, "%d", $scelta);
switch($scelta){
case 1:
crea();
break;
case 2:
ordina();
break;
case 3:
ordina2();
break;
case 4:
cerca();
break;
default:
print "scelta non valida\n";
}
function crea(){
$f = fopen("persone", "w") or die("errore nell'apertura del file\n");
print "quante persone : ";
fscanf(STDIN, "%d", $n);
for($i=0; $i<$n; $i++){
print "nome numero ".($i+1)." : ";
fscanf(STDIN, "%s", $nome);
print "eta di $nome : ";
fscanf(STDIN, "%d", $eta);
fputs($f, str_pad($nome,20)."-".str_pad($eta,2)."\n");
}
fclose($f);
}
function ordina(){
$f = fopen("persone", "r+") or die("errore nell'apertura del file\n");
fseek($f, 0, 2);
$n = ftell($f)/24;
fseek($f, 0);
do{
$k = 0;
for($i=0; $i<$n-1; $i++){
$str = explode("-", fgets($f));
$str2 = explode("-", fgets($f));
if($str[0]>$str2[0]){
fseek($f, 24*$i);
fputs($f, implode("-", $str2));
fputs($f, implode("-",$str));
$k = $i+1;
}
fseek($f, 24*$i+24);
}
$n = $k;
fseek($f, 0);
}while($k);
fclose($f);
}
function ordina2(){
$f = fopen("persone", "r+") or die("errore nell'apertura del file\n");
fseek($f, 0, 2);
$n = ftell($f)/24;
fseek($f, 0);
do{
$k = 0;
$str = explode("-", fgets($f));
for($i=1; $i<$n; $i++){
$str2 = explode("-", fgets($f));
if($str[0]>$str2[0]){
fseek($f, 24*$i-24);
fputs($f, implode("-", $str2));
fputs($f, implode("-", $str));
$k = $i+1;
}else
$str=$str2;
fseek($f, 24*$i+24);
}
$n = $k;
fseek($f, 0);
}while($k);
fclose($f);
}
function cerca(){
print "nome da cercare : ";
fscanf(STDIN, "%s", $ele);
$ele = str_pad($ele, 20);
$f = fopen("persone", "r") or die("errore nell'apertura del file\n");
$alto = 0;
fseek($f, 0, 2);
$basso = ftell($f);
$pos = -1;
do{
$i = ((int)(($alto/24+$basso/24)/2)*24);
fseek($f, $i);
if(($cor = fread($f,20)) == $ele)
$pos = $i;
else if($cor <$ele)
$alto = $i+24;
else
$basso = $i-24;
}while($alto<=$basso && $pos==-1);
if($pos>=0){
fseek($f, $pos);
print fgets($f);
}else
print "nome non trovato\n";
fclose($f);
}
?>