PDA

Visualizza la versione completa : [C] Scrivere N numeri random in un file


AB03
14-06-2008, 15:10
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.

oregon
14-06-2008, 16:50
Partiamo dal tuo codice ...

metal_prog
14-06-2008, 17:26
#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... :ciauz:

AB03
14-06-2008, 18:19
Il mio programma è il seguente:


#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:



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

oregon
14-06-2008, 18:28
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 ...

PaoloNA
16-06-2008, 19:21
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è?

metal_prog
16-06-2008, 21:38
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

PaoloNA
16-06-2008, 22:20
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);
}

PaoloNA
17-06-2008, 18:08
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!

mondobimbi
17-06-2008, 18:48
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

Loading