[C] Scrivere intero su file - quanti bit occorrono

di il
5 risposte

[C] Scrivere intero su file - quanti bit occorrono

Ciao a tutti! Devo scrivere un programma in C che presa in input una stringa, scrive la lunghezza della stringa in un file. Per realizzarlo devo usare le funzioni di I/O a basso livello. Ho scritto il programma e sembra funzionare, ma volevo capire una cosa.
Premetto che utilizzo ubuntu.
La funzione write prende in ingresso il file descriptor, la "sorgente" e il numero di byte da scrivere. Nel mio programma, salvo la lunghezza della stringa (ottenuta con strlen(stringa)) in una variabile intera che ho chiamato 'dim'. Sapendo che un int occupa 32 bit (cioè 4 byte), chiamo la funzione write(fd,&dim,4). Quando testo il programma, se per esempio scrivo la stringa "prova", nel file mi ritrovo una sorta di quadratino contenente 0 0 0 5 (che deduco sia la rappresentazione esadecimale di 5, in binario 0000 0000 0000 0101) e poi 3 sequenze di \00... quindi mi trovo quadratino\00\00\00 come se il numero contenuto in dim sia scritto in un solo byte e gli altri tre siano \00. Infatti se chiamo la funzione write(fd,&dim,1) nel file mi ritrovo il solo quadratino con i 4 numeretti che riescono a codificare comunque i 4 byte. Vorrei quindi capire, quel quadratino è un qualche carattere speciale di ubuntu che mi rappresenta 4 byte su un unico byte o cosa? Sinceramente sono un po confuso. Grazie a tutti per l'eventuale aiuto

5 Risposte

  • Re: [C] Scrivere intero su file - quanti bit occorrono

    Ma tu cosa scrivi nel file? Mostra il codice.
  • Re: [C] Scrivere intero su file - quanti bit occorrono

    oregon ha scritto:


    Ma tu cosa scrivi nel file? Mostra il codice.
    Ciao! Adesso ti posto il codice. Premetto che la traccia richiede esplicitamente che la lunghezza 'dim' NON sia convertita in stringa. La variabile 'esito' l'ho aggiunta giusto per vedere se la scrittura veniva effettuata correttamente. Il programma termina quando viene inserita la stringa fine.
    
    int main(){
    	char nomefile[20];
    	char stringa[50];
    	int fd,dim,esito;
    
    	printf("Inserisci il nome del file: ");
    	scanf("%s",nomefile);
    	fd=open(nomefile,O_WRONLY);
    	if(fd<0)
    		perror("Impossibile aprire il file!\n"),exit(1);
    	do{	
    		printf("Inserisci stringa: ");
    		scanf("%s",stringa);
    		dim=strlen(stringa);
    		esito=write(fd,&dim,4);
    		printf("%d\n",esito);
    	}while(strcmp(stringa,"fine\0"));
    	close(fd);
    return 0;
    }
    
  • Re: [C] Scrivere intero su file - quanti bit occorrono

    Quale stringhe hai usato? Cosa trovi nel file binario? Considera che anche la stringa "fine", con 4 caratteri, verrà presa in considerazione.
  • Re: [C] Scrivere intero su file - quanti bit occorrono

    oregon ha scritto:


    Quale stringhe hai usato?
    Se intendi l'header, ho usato string.h

    oregon ha scritto:


    Cosa trovi nel file binario?
    Cosa intendi esattamente? Cioè il file nel quale scrivo con la write è un .txt..Se intendi quello, all'interno ci trovo come detto questo quadratino con 4 numeri (che suppongo siano la rappresentazione esadecimale della lunghezza 'dim') ed eventualmente sequenze di \00 (in base al num di byte che passo alla funzione write). Questo quadratino si comporta come se fosse un singolo carattere. Dimmi se non ho ben capito la domanda

    oregon ha scritto:


    Considera che anche la stringa "fine", con 4 caratteri, verrà presa in considerazione.
    Si lo avevo notato... dovrei aggiungerci un if dopo l'inserimento della stringa e scrivere nel file solo se la stringa non è "fine"
  • Re: [C] Scrivere intero su file - quanti bit occorrono

    No ... non ci siamo capiti ...

    Volevo sapere, quando esegui il programma, quali stringhe inserisci? Ad esempio, se scrivi

    mamma
    fine

    allora troverai nel file binario (non è importante l'estensione che usi, stai scrivendo in binario)

    05 00 00 00 04 00 00 00

    perché un intero a 4 byte viene scritto "al contrario", dal byte meno significativo al più significativo. Quindi 05 00 00 00 per la prima stringa e 04 00 00 00 per la seconda stringa.

    Fra l'altro, non dovresti scrivere 4 nella write ma

    sizeof(int)

    I "quadratini" che vedi altro non sono che i caratteri ASCII corrispondenti a 00 o 05 o 04 a seconda del set di caratteri utilizzato, ma NON sono significativi proprio perché un file scritto in binario non lo devi visualizzare con il notepad ma con un editor esadecimale.
Devi accedere o registrarti per scrivere nel forum
5 risposte