MauriDalia Δημοσ. 14 Μαΐου 2008 Δημοσ. 14 Μαΐου 2008 Γεια σας, Στο παρακατω προγραμμα προσπαθω να διαβασω τα περιεχομενα του αρχειου jacobi.txt , να εκτυπωσω αυτα που διαβαζω στην οθονη μου και στην συνεχειαα να περασω αυτες τις τιμες που διαβασα σε εναν πινακα floats τον t. > #include <stdio.h> #include <math.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #define NPROC 1 #define NR 14 //grammes #define NC 14 #define NRL (NR/NPROC) //NRL=14 #define NITER 1000 main(int argc,char **argv) { float t[NRL+2][NC+2]; char buf[32]; FILE * hFile; hFile = fopen("jacobi.txt", "r"); for(i=0;i<=NRL+1;i++) { //apo 0 ews 15.... fgets(buf,sizeof(buf),hFile); printf("%s\n",buf); for(j=0;j<=NC+1;j++) { t[i][j]=buf[2*j]; } } fclose( hFile); } Ομως μου πεταει segmentation fault:cry: Καμια ιδέα?Ευχαριστω
MauriDalia Δημοσ. 14 Μαΐου 2008 Μέλος Δημοσ. 14 Μαΐου 2008 Συγνωμη ξεχασα να παραθεσω το αρχειο jacobi.txt
MauriDalia Δημοσ. 15 Μαΐου 2008 Μέλος Δημοσ. 15 Μαΐου 2008 Με καποιες αλλαγες που εκαναα καταφερα να διαβαζω και να εκτυπωνω το περιεχομενο του αρχειου μου.Το επομενο που προσπαθω να καταφερω ειναι να καταχωρω τις τιμες αυτες σε εναν δισδιαστατο πινακα floats αλλα μαλλον θελει καποια συναρτηση μετατροπης.Δοκιμασα την atof αλλα δεν τα καταφερα > #include <stdio.h> #include <math.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #define NPROC 1 #define NR 14 #define NC 14 #define NRL (NR/NPROC) #define NITER 1000 int main(int argc, char *argv[]) { FILE *fp; char ch; float t[NRL+2][NC+2]; fp = fopen("jacobi.txt","r"); while((ch = fgetc( fp )) != EOF) { printf("%c", ch); for(i=0;i<=NRL+1;i++) { for(j=0;j<=NC+1;j++) { t[i][j]=atof(c); } } } fclose(fp); for(i=0;i<=NRL+1;i++) { for(j=0;j<=NC+1;j++) { printf("%f",t[i][j]); printf("\n"); } } return 0; } Καμια βοηθεια?
parsifal Δημοσ. 15 Μαΐου 2008 Δημοσ. 15 Μαΐου 2008 Καλησπέρα. Μερικές παρατηρήσεις: 1. Έχεις ένα σοβαρό λογικό λάθος: Σε κάθε επανάληψη της while, προσπαθείς να γεμίσεις όλες τις θέσεις του πίνακά σου με τη μοναδική τιμή που μόλις διαβάστηκε από την fgetc 2. Η fgetc διαβάζει αδιακρίτως όλους τους χαρακτήρες από το αρχείο. Και τα κενά μεταξύ των στοιχείων του πίνακα, και το χαρακτήρα αλλαγής γραμμής στο τέλος κάθε γραμμής. Δεν το έχεις προβλέψει στον κώδικά σου 3. H atof περιμένει ως όρισμα char*, εσύ όμως της περνάς char. To c αντί του ch είναι εκ παραδρομής, σωστά; Χωρίς να γίνει ο κώδικας πολύ περίπλοκος (επειδή υποπτεύομαι ότι είσαι στην αρχή της εκμάθησης C), ορίστε μία εναλλακτική λύση που έγραψα στα γρήγορα. Πρέπει να δουλεύει: > #include <stdio.h> #include <math.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #define NPROC 1 #define NR 14 #define NC 14 #define NRL (NR/NPROC) #define NITER 1000 int main(int argc, char *argv[]) { FILE *fp; float item; int i, j; float t[NRL+2][NC+2]; fp = fopen("jacobi.txt","r"); for(i = 0; i <= NRL + 1; i++) for(j = 0; j <= NC + 1; j++) { fscanf(fp, "%f", &item); printf("%.0f ", item); t[i][j] = item; } fclose(fp); printf("\n\n"); for(i = 0; i <= NRL + 1; i++) { for(j = 0; j <= NC + 1; j++) printf("%.0f ", t[i][j]); printf("\n"); } return 0; } Βέβαια, ούτε αυτή η προσέγγιση είναι καλή. Αν είχες αναπαράσταση πίνακα διαφορετικού μεγέθους; Θα έπρεπε να μετρήσεις αριθμό γραμμών,στηλών στο αρχείο και να δεσμεύσεις δυναμικά μνήμη για τον πίνακά σου. Μάλλον θέματα που θα συναντήσεις στην πορεία...
MauriDalia Δημοσ. 20 Μαΐου 2008 Μέλος Δημοσ. 20 Μαΐου 2008 Καλησπερα!!Επαναφερω το θεμα στην επικαιροτητα γιατι εχω να αντιμετωπισω ακομα ενα θεμα.Τωρα το αρχειο που πρεπει να διαβασω εχει 3 στηλες.Ομως εγω πρεπει να διαβασω μονο την 3η στηλη του αρχειου.Αυτο θα το κανω με την fscanf?? > #include <stdio.h> #include <math.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #define NPROC 1 #define NR 1 #define NC 1 #define NRL (NR/NPROC) #define NITER 1000 int main(int argc, char *argv[]) { FILE *fp; float item; char c; int i,j,iter,niter; float before[NRL+2][NC+2],after[NRL+2][NC+2]; float diff=0.0; float Epsilon=0.001000; float change; struct timeval Start, Stop, Diaf; //metrhsh xronou fp = fopen("dok.txt","r"); for(i = 0; i <= NRL + 1; i++) for(j = 0; j <=NC +1; j++) { c = getc (fp); if ((c!=i)&&(c!=j)) fscanf(fp, "%f", &item); printf("%.0f ", item); before[i][j] = item; } */ fclose(fp); printf("\n\n"); for(i = 0; i <= NRL + 1; i++) { for(j = 0; j <= NC + 1; j++) printf("%.0f ", before[i][j]); printf("\n"); } fprintf(stderr,"How many iterations [100-1000]?"); scanf("%d",&niter); if(niter>NITER)niter=NITER; gettimeofday(&Start, NULL); for(iter=1;iter<=niter;iter++) //Basikos epanaliptikos broxos pou xrhsimopoiei niter epanalipseis { for(i = 1; i < NRL + 1; i++) { for(j = 1; j <NC + 1; j++) { after[i][j]=0.25*(before[i+1][j]+before[i-1][j]+before[i][j+1]+before[i][j-1]); printf("\n"); if (fabs(after[i][j]-before[i][j])>diff) diff=fabs(after[i][j]-before[i][j]); } } if(diff<=Epsilon) break; gettimeofday(&Stop, NULL); for(i=1;i<NRL+1;i++) for(j=1;j<NC+1;j++) before[i][j]=after[i][j]; } timersub(&Stop , &Start , &Diaf); fprintf(stdout,"SYNOLIKOS XRONOS:\n"); fprintf(stdout,"Time: %6ld sec %6ld microsec\n",Diaf.tv_sec,Diaf.tv_usec); return 0; } Αυτος ειναι ο κωδικας που μεχρι στιγμης εχουμε φτιαξει.Και το αρχειο που πρεπει διαβασω ειναι αυτο που επισυναπτω Δηλαδη θελω απο το αρχειο να περνω την 3η στηλη και να την αποθηκευω στον πινακα before[j].Αν παρατηρησετε οι 2 πρωτες στηλες αναφερονται στο i,j Καθε βοηθεια ευπροσδεκτη. :cry: dok.txt
Directx Δημοσ. 20 Μαΐου 2008 Δημοσ. 20 Μαΐου 2008 Για ρίξε μια ματιά σε αυτό το θέμα http://www.insomnia.gr/forum/showthread.php?t=251608, καθώς ζητάς περίπου τα ίδια πράγματα (μόνο που διαβάζεις από αρχείο και φυσικά η διάταξη των αριθμών διαφέρει), δεν είναι δύσκολο να προσαρμόσει τον κώδικα μου στις ανάγκες σου ή να πάρεις κάποιες ιδέες από αυτόν. Καλή συνέχεια.
MauriDalia Δημοσ. 20 Μαΐου 2008 Μέλος Δημοσ. 20 Μαΐου 2008 Για ρίξε μια ματιά σε αυτό το θέμα http://www.insomnia.gr/forum/showthread.php?t=251608, καθώς ζητάς περίπου τα ίδια πράγματα (μόνο που διαβάζεις από αρχείο και φυσικά η διάταξη των αριθμών διαφέρει), δεν είναι δύσκολο να προσαρμόσει τον κώδικα μου στις ανάγκες σου ή να πάρεις κάποιες ιδέες από αυτόν. Καλή συνέχεια. Βασικα με δυσκολευει διοτι εγω δεν θελω να διαβαζω απο την εισοδο αλλα κατευθεια απο το αρχειο.Καμια ιδεα πως μπορω να το αποφυγω αυτο?
Directx Δημοσ. 20 Μαΐου 2008 Δημοσ. 20 Μαΐου 2008 Το stdin λειτουργεί ως FILE*, ακολουθεί το πρόγραμμα τροποποιημένο ώστε να διαβάζει το αρχείο σου (ως πρώτη παράμετρος του εκτελέσιμου) σε ένα 1D float array και να μην χρησιμοποιεί τα stdout / stderr κτλ. Τα σχόλια μπορούν να σε καθοδηγήσουν στο πως & γιατί. > /*-Read "stdin" by Directx v2 for MD-----------------------------------------*/ #include <stdio.h> #ifdef __BORLANDC__ #pragma hdrstop #endif /*---------------------------------------------------------------------------*/ #define _ARRAY_SIZE_LINE 9 #define _ARRAY_SIZE_ITEMS 3 #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { char szBuffer[bUFSIZ]; float f2DArray[_ARRAY_SIZE_LINE]; int nY = 0; FILE *Stream = NULL; /* * Open file for read */ if((Stream=fopen(argv[1],"r"))==NULL) { printf(" DOS Error: Cannot open file for read - %s\n", argv[1]); return -1; } /* * Store "Stream" into szBuffer and then into f2DArray, * stop if no data found or if we read more than _ARRAY_SIZE_LINE. */ while(fgets(szBuffer,sizeof(szBuffer),Stream) != NULL && nY<_ARRAY_SIZE_LINE) { /* We can temporarly store here the preceding useless integers */ static int nDummyVal; /* Read szBuffer integers into f2DArray */ if(sscanf(szBuffer, "%d%d%f", &nDummyVal, &nDummyVal, &f2DArray[nY])!=_ARRAY_SIZE_ITEMS) { /* sscanf failed to read at least _ARRAY_SIZE_ITEMS -- program stops */ printf("Malformed Stream - %s\n", argv[1]); fclose(Stream); return -1; } /* Move to next Array/Line */ nY++; } /* Check if we read fewer than _ARRAY_SIZE_LINEs from file */ if(nY<_ARRAY_SIZE_LINE) printf("Lines count mismatched - %s (%d)\n", argv[1], nY); /* Close opened file */ fclose(Stream); /* Dump Array on screen, assume 1 digit (%.1f) float precision (0.70 => 0.7) */ for(nY = 0; nY < _ARRAY_SIZE_LINE; nY++) printf("%.1f\n", f2DArray[nY]); return 0; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.