Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    35

    [C] Scrivere N numeri random in un file

    Ciao a tutti,

    Devo generare N numeri random da scrivere uno per riga in un file, qualcuno sa dirmi come posso fare?

    Io ho provato, e riesco a generare i numeri random ma quando cerco di scriverli all'interno del file mi da segmentation fault.

    Io ho provato sia con la open e la creat per la creazione del file e poi con la write ma non ci siresco a scrivere sul file.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Partiamo dal tuo codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      FILE *src;
      int i, k, n;
      printf("Inserire un numero:");
      scanf("%d", &n);
      src=fopen("src.txt", "w");
      for(i=0; i<n; i++)
      {
        k=((float)rand()/RAND_MAX)*100;
        fprintf(src, "%d\n", k);
      }
      fclose(src);
      return 0;
    }
    Per comodità non ho messo gestioni degli errori e quant'altro...
    poi vedi tu...
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    35
    Il mio programma è il seguente:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <time.h>
    #include <string.h>
    #include <sys/stat.h>
    
    #define N 50
    #define dim 10
    
    int main (int argc, char **argv) {
    
    	int i;
    	char nome_file;
    	int fp;
    
    	printf("Nome file su cui scrivere: ");
    	scanf("%s", &nome_file);
    
    	fp = open (&nome_file, O_CREAT, 0666);    // ho messo la & perchè mi dava errore ma di solito anche se non la metto va
    
    	srand (time(NULL));
    
    	for (i=0; i<=N; i++) {
    		int num_int = rand();
    		write(fp, &num_int, 10);                            // dovrebbe srivermi i numeri su file
    		printf("Numero (%d): %d\n", i, num_int);   // stampa i numeri a video
    	}
    	close (fp);
    }

    Però non funziona, mi stampa i numeri a video mi crea il file ma vuoto, di seguito l'output:

    codice:
    :
    :
    :
    Numero (47): 1458414155
    Numero (48): 425876524
    Numero (49): 279330535
    Numero (50): 1838176295
    Segmentation fault

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Se dichiari un semplice char per il nome del file (un solo carattere ...) e' ovvio che avrai problemi ...

    Il nome del file e' una stringa e quindi devi prevedere un array di char con un numero di caratteri adeguati per inserire il nome stesso (ne ho previsti una trentina) ...

    char nome_file[30];

    Fatto questo, dato che il nome di un array corrisponde all'indirizzo del suo primo elemento, la scanf sara'

    scanf("%s", nome_file);

    e la open

    fp = open (nome_file, O_CREAT, 0666);

    senza il carattere & in quanto gia' puntatore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    385
    Ragazzi ho lo stesso problema: creo il file (vedo che lo ha creato), ma quando faccio una write mi mostra semplicemente a video ciò che dovrebbe mettere nel file, lasciando questo vuoto.

    Perchè?

  7. #7
    Perché usi printf("%d", num) o fpintf(stdout, "%d", num); o qualcosa del genere, che stampa a video ciò che dovrebbe stampare il file... posta il codice
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    385
    Francamente non mi sembra... il fatto è che crea il file senza dare errori, ma poi scrive a terminale e lascia il file vuoto... ecco il frammento di codice:

    {
    bzero (&buf, sizeof(buf)); /* Reset di buf */
    leggi_dati(socket_connessioni[i], buf, 50); /* Lettuta del nome del */
    /* file inviato dal client */
    /* Composizione del percorso del nuovo file */
    bzero (&path, sizeof(path)); /* Reset di path */
    strcat (path, directory);
    strcat (path, "/");
    strcat (path, buf);

    /* Creazione del nuovo file: se questo già esiste, si comunica "File*/
    /* esistente" e si esce (idem nel caso di altri errori) */
    if (pf=open (path, O_RDWR | O_CREAT, S_IRWXU)<0)
    {
    if (errno==EEXIST)
    printf ("\n File esistente\n");
    else perror (" Errore creazione file ");
    printf (" Inserire un carattere per terminare: ");
    scanf ("%d", &temp);
    exit (-1);
    }

    /* Ricezione contenuto del file dal client e scrittura nel file: */
    /* vengono letti dal socket, scritti in buf ed inviati al file, max */
    /* 300 byte per volta */
    printf ("\n Ricezione dati file dal client\n");
    bzero (&buf, sizeof(buf)); /* Reset di buf */
    letti=leggi_dati (socket_connessioni[i], buf, 300);
    /* Ciclo che continua finchè vengono letti ancora caratteri */
    while (letti>0)
    {
    scrivi_dati(pf, buf, 300); /* Scrittura nel buffer */
    bzero (&buf, sizeof(buf)); /* Reset di buf */
    letti=leggi_dati (socket_connessioni[i], buf, 300);
    }
    close(pf); /* Chiusura del file descriptor */
    close(socket_connessioni[i]); /* Chiusura del socket del server */
    printf (" Scrittura del file eseguita. Premere per continuare: \n");
    scanf ("%d", &temp);
    }

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    385
    Allora, ho scoperto stampando il file descriptor (intero) dopo la open (ho provato anche con la creat), che il suo valore è 0! (ecco perchè stampa a terminale) mentre con altre open fatte da altre parti, il file descriptor tornato è 4 e quindi funziona.

    Quindi pare che addirittura si chiudano i file descriptor standard...

    Boh!

    HELP!

  10. #10
    a stdin, stdout e stderr sono associati i descrittori rispettivamente 0, 1 e 2 e non si devono aprire esplicitamente, ci pensa il sistema.
    Quando apri un file il sistema ti ritorna un nuovo descrittore che è necessariamente maggiore di 2 (in quanto i primi tre sono già impegnati) o minore di 0 se c'è un errore (per esempio non ci sono più descrittori disponibili o il file non esiste o non è accessibile alla lettura ecc.)
    Quindi quello che dici è molto strano.
    Se riesci prova a circoscrivere la cosa in un programmino compilabile e postalo.
    ciao
    sergio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.