Ciao,
per prima cosa voglio ringraziarti per la risposta. È anche probabile che fra tutte le ricerche che ho fatto su Internet fin'ora sia già capitato di fronte a quel codice. Solo che a differenza di ora non l'avevo provato.
Il problema fondamentale è che questo codice fa la separazione in token, dove il delimitatore è lo spazio. Io invece dovrei trattare stringhe di lunghezza indefinita (ipoteticamente anche lunghe migliaia di caratteri, e senza spazi) e spezzarle in blocchi di 8 byte ciascuno. Poi potrei, in seguito, trattare direttamente byte.
Al momento ho provato a buttare giù del codice, che però non funziona:
codice:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#define BLOCK_DIM 8
int get_filesize(char *file_name);
typedef struct {
void *block;
} block_bytes;
int main(int argc, char *argv[]){
int file_size = get_filesize("textfile.txt");
int num_of_blocks;
int i,j,k;
void *file;
printf("File size: %d\n", file_size);
int abs = file_size % BLOCK_DIM;
printf("abs: %d\n", abs);
if(abs == 0){
num_of_blocks = file_size / BLOCK_DIM;
}else{
num_of_blocks = file_size / BLOCK_DIM + 1;
}
printf("blocks: %d\n", num_of_blocks);
block_bytes blocks[num_of_blocks];
int fd = open("textfile.txt",O_RDONLY);
if(fd==-1){
perror("could not open file");
exit(-1);
}
file = malloc(file_size);
if(read(fd,file,file_size)==-1){
perror("could not open file");
exit(-1);
}
close(fd);
printf("%s\n",(char *)file);
/* QUI VORREI INSERIRE DEL CODICE CHE FA LA
* SCANSIONE DI file CARATTERE PER CARATTERE
* E PRENDE I BYTE DI file 8 ALLA VOLTA E
* LI INSERISCE IN OGNI ELEMENTO DI blocks
* CHE A SUA VOLTA È UN ARRAY DI num_blocks ELEMENTI
*/
for(j=0;j<file_size;j++){
for(k=0;k<BLOCK_DIM;k++){
}
}
}
int get_filesize(char *file_name){
struct stat file_stat;
if(stat(file_name, &file_stat) != 0) {
perror("could not stat");
return (-1);
}
return (int)file_stat.st_size;
}
Inoltre, qui ho trovato anche il seguente codice:
codice:
#include <string.h>
#define SMAX 10
typedef struct {char str[SMAX+1];} ST;
int main()
{
ST st[SMAX]={0};
char *tmp = "For configuration options (arch/xxx/config.in, and all the Config.in files),somewhat different indentation is used.";
int i=0,j;
for( ; (st[i++]=*(ST*)tmp).str[SMAX]=0 , strlen(tmp)>=SMAX; tmp+=SMAX );
for( j=0;j<i;++j )
puts(st[j].str);
return 0;
}
Il problema è che per SMAX<11 va in errore, altrimenti sarebbe anche buona come funzione. Certo, dovrei riadattarla (anche se per me è un po' complicato il primo ciclo for), ma almeno funziona. Io dovrei impostare SMAX = 8.
Poi ho finito le idee...