PDA

Visualizza la versione completa : [C] Lettura e scrittura di file .dat


sullivandi
06-01-2012, 18:39
Ciao a tutti. Ho un problema con un programma in c.
Io genero due file.dat con il seguente codice


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <time.h>
#include <math.h>

main(int argc, char** argv){

FILE *fd1;
FILE *fd2;
double value, ordine;
int i, j, k;

srand(time(NULL));

fd1 = fopen(argv[1],"wb");
fd2 = fopen(argv[2],"wb");

ordine = 2;

fwrite(&ordine, sizeof(double), 1, fd1);
fwrite(&ordine, sizeof(double), 1, fd2);
printf("ordine = %f\n", ordine);
for(i=0;i<5;i++){
for(j=0;j<ordine;j++){
for(k=0;k<ordine;k++){
value = rand()%10;
fwrite(&value,sizeof(value),1,fd1);
value = rand()%10;
fwrite(&value,sizeof(value),1,fd2);
}
}
printf("Matrice \n");
}
printf("FATTO!\n");
fclose(fd1);
fclose(fd2);
}
e per leggere i file creati uso il seguente codice che mi stampa nel terminale il contenuto del file che gli passo in ingresso.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <time.h>
#include <math.h>

main(int argc, char** argv){

FILE *fd;
double value;
value = 1;

fd = fopen(argv[1],"rb");
fread(&value,sizeof(value),1,fd);
while(!feof(fd)){
printf("%f\n", value);
fread(&value,sizeof(value),1,fd);

}
fclose(fd);
}

Cos sembrerebbe funzionare per quando modifico i file in ingresso con il seguente codice che dovrebbe moltiplicare l'iesima matrice del primo file con l'iesima matrice del secondo, sommare tutte le matrici ed aggiornale il file di output ogni NStep matrici (NStep un valore passato in ingresso) il programma mi si pianta prima di terminare le somme, e il figlio Updater non stampa nulla nel file, o meglio lo crea e mi stampa un valore che tra l'altro non centra niente con ordine(il primo valore da stampare che rappresenta l'ordine delle matrici).

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <fcntl.h>
#include <sys/wait.h>


void workerA1(char* fname, int* ch1);
void workerA2(char* fname, int* ch2);
void workerMol(int* ch1, int* ch2, int*ch3, double ordine, double **a, double **b, double **c);
void workerSum(int* ch3, int*ch4, double ordine, int NStep, double **d);
void Updater(char* fname, int* ch4, double ordine, int NStep, double **e);
double prodmat(double **a, double **b, double **c, double ordine);


main (int argc, char** argv){
FILE *fdi;
int i, j;
int NStep = atoi(argv[4]);
int ns = 0;
double ordine, value;
double **a, **b, **c, **d, **e;

pid_t pid;
int channel1[2],channel2[2], channel3[2], channel4[2];

pipe(channel1);
pipe(channel2);
pipe(channel3);
pipe(channel4);

fdi = fopen(argv[1],"rb");

if (fdi < 0){
perror("Errore nell'apertura del file.");
exit(1);
}
fread(&ordine,sizeof(double),1,fdi);
printf("l'ordine : %f\n", ordine);
fclose(fdi);

printf("NStep : %d\n", NStep);

pid = fork();
if(pid == 0){
workerA1(argv[1],channel1);
exit(0);
}

pid = fork();
if(pid == 0 ){
workerA2(argv[2],channel2);
exit(0);
}

pid = fork();
if(pid == 0){
a= (double**)malloc(ordine*sizeof(double*));
for (i=0; i<ordine; i++){
a[i]=(double*)malloc(ordine*sizeof(double));
}

b = (double**)malloc(ordine*sizeof(double*));
for (i=0; i<ordine; i++){
b[i]=(double*)malloc(ordine*sizeof(double));
}

c = (double**)malloc(ordine*sizeof(double*));
for (i=0; i<ordine; i++){
c[i]=(double*)malloc(ordine*sizeof(double));
}

workerMol(channel1,channel2, channel3, ordine, a, b, c);
exit(0);
}

pid = fork();
if(pid == 0){
d = (double**)calloc(ordine, sizeof(double*));
for (i=0; i<ordine; i++){
d[i]=(double*)calloc(ordine, sizeof(double));
}
workerSum(channel3, channel4, ordine, NStep, d);
exit(0);
}

pid = fork();
if(pid == 0){
e = (double**)malloc(ordine*sizeof(double*));
for (i=0; i<ordine; i++){
e[i]=(double*)malloc(ordine*sizeof(double));
}
Updater(argv[3], channel4, ordine, NStep, e);
exit(0);
}

for(i=0;i<5;i++){

wait(NULL);

}
free(a);
free(b);
free(c);
free(d);
free(e);
}

void workerA1(char* fname, int* ch1){
FILE *fd;
double value;

printf("Worker A1 \n");
fd = fopen(fname,"rb");
if (fd < 0){
perror("Errore nell'apertura del file.");
exit(1);
}
fseek(fd, sizeof(double), SEEK_SET);
close(ch1[0]);
while(!feof(fd)){
fread(&value,sizeof(double),1,fd);
write(ch1[1],&value,sizeof(value));
}
printf("Fine lettura A1\n");
fclose(fd);
value = -1;
write(ch1[1],&value,sizeof(value));
printf("Value fine primo figlio: %f\n", value);
close(ch1[1]);
exit(0);
}

void workerA2(char* fname, int* ch2){
FILE *fd;
double value;

printf("Worker A2 \n");
fd = fopen(fname,"rb");
if (fd < 0){
perror("Errore nell'apertura del file.");
exit(1);
}
fseek(fd, sizeof(double), SEEK_SET);
close(ch2[0]);
while(!feof(fd)){
fread(&value,sizeof(double),1,fd);
write(ch2[1],&value,sizeof(value));
}
printf("Fine lettura A2\n");
value = -1;
write(ch2[1],&value,sizeof(value));
printf("Value fine secondo figlio: %f\n", value);
fclose(fd);
close(ch2[1]);
exit(0);
}

void workerMol(int* ch1, int* ch2, int*ch3, double ordine, double **a, double **b, double **c){
double value1, value2;
int i, j;
close(ch1[1]);
close(ch2[1]);
close(ch3[0]);

/*Alloco la memoria per le tre matrici*/


printf("WorkerMol \n");
while(value1 != -1 && value2 != -1){
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
if(value1 != -1){
read(ch1[0],&value1,sizeof(value1));
if(value1 != -1){
a[i][j]=value1;
}
}else if(value1 == -1 && value2 == -1){
i=ordine+1;
}
if(value2 != -1){
read(ch2[0],&value2,sizeof(value2));
if(value2 != -1){
b[i][j]=value2;
}
}else if(value1 == -1 && value2 == -1){
i=ordine+1;
}
}
}
prodmat(a, b, c, ordine);
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
write(ch3[1],&c[i][j],sizeof(double));
}
}
}
printf("Fine moltiplicazione\n");
write(ch3[1],&value1,sizeof(value1));
printf("Value fine terzo figlio: %f\n", value1);
close(ch1[0]);
close(ch2[0]);
close(ch3[1]);
//free(a);
//free(b);
//free(c);
exit(0);
}

/*metodo per fare il prodotto tra matrici*/
double prodmat(double **a, double **b, double **c, double ordine){
int i, j, k;
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
c[i][j]=0;
for (k=0; k<ordine; k++){
c[i][j]= c[i][j]+(a[i][k]*b[k][j]);
}
}
}
}
/*metodo per fare la somma tra matrici*/
void workerSum(int* ch3, int*ch4, double ordine, int NStep, double** d){
double value;
int i, j;
int ns = 0;

printf("WorkerSum \n");
close(ch3[1]);
close(ch4[0]);

while(value != -1){
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
read(ch3[0],&value,sizeof(value));
if(value != -1){
d[i][j]+=value;
printf("la matrice somma: %f \n", d[i][j]);
}else{
i=ordine+1;
}
}
}
if(value != -1){
ns++;
printf("ns: %d \n", ns);
if(ns == NStep){
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
write(ch4[1],&d[i][j],sizeof(value));
}
}
ns=0;
}
}else{
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
write(ch4[1],&d[i][j],sizeof(value));
}
}
}
}
printf("Fine somme\n");
write(ch4[1],&value,sizeof(value));
printf("Value fine quarto figlio: %f\n", value);
close(ch3[0]);
close(ch4[1]);
//free(d);
exit(0);
}

void Updater(char* fname, int* ch4, double ordine, int NStep, double **e){
FILE *fdo;
int i, j;
double value;

printf("Updater \n");
fdo = fopen(fname, "wb");
if (fdo < 0){
perror("Errore nell'apertura del file.");
exit(1);
}
printf("Ordine updater:%f \n", ordine);
fwrite(&ordine, sizeof(ordine), 1, fdo);

close(ch4[1]);
while(value != -1){
for (i=0; i<ordine; i++){
for (j=0; j<ordine; j++){
read(ch4[0],&value,sizeof(value));
if(value != -1){
e[i][j]=value;
fwrite(&e[i][j],sizeof(double), 1, fdo);
}else{
i=ordine+1;
}
}
}
}

close(ch4[0]);
fclose(fdo);
//free(e);
exit(0);
}
Non capisco dove sbaglio, sono giorni che ci sto dietro!! :dh:

Loading