macgyver Δημοσ. 4 Νοεμβρίου 2010 Δημοσ. 4 Νοεμβρίου 2010 Αγαπητοί φίλοι, έχω το εξής πρόβλημα: έχω ένα αρχείο test.txt με ακέραιους της μορφής 1 6 0 8 2 4 3 5 7. Αυτό που θέλω να κάνω είναι να διαβάσω το αρχείο και τους ακέραιους να τους σώσω σε ένα δισδιάστο πινακα. Υπόψήν ότι η μορφή του αρχείου μπορεί να αλλάξει πχ 1 6 0 7 8 2 4 3 9 11 12 10 αλλά πάντα είναι συμμετρικό με μέγιστο 8χ8. Ευχαριστώ εκ των προτέρων Με εκτίμηση.
pinball_elf Δημοσ. 4 Νοεμβρίου 2010 Δημοσ. 4 Νοεμβρίου 2010 Πιθανή λύση: Θα διαβάζεις γραμμή-γραμμή το αρχείο. Κάθε φορά λοιπόν που θα διαβάζεις μία γραμμή θα την δίνεις στην sscanf για να σου δώσει τους αριθμούς αλλά και το πλήθος αυτών: > ... int t[8] int a[8,8]; char line [128]; int n = 0; int m; int i; ... while (!<end_of_File>) { /* read next line */ m = sscanf(line, "%d %d %d %d %d %d %d %d", &t[0], &t[1], &t[2], &t[3], &t[4], &t[5], &t[6], &t[7]); for (i=0; i<m;i++) a[n,i] = t[i]; n++; } ... Προσοχή γιατί ο παραπάνω κώδικας έχει συντακτικά λάθη. Θεώρησε τον κάτι σαν αλγόριθμο.
macgyver Δημοσ. 4 Νοεμβρίου 2010 Μέλος Δημοσ. 4 Νοεμβρίου 2010 Ευχαριστώ για την γρήγορη απάντηση φίλε μου. Θα το δοκιμάσω και θα αναρτήσω αποτελέσματα.
thanos713 Δημοσ. 4 Νοεμβρίου 2010 Δημοσ. 4 Νοεμβρίου 2010 Μα αφού δεν ξέρεις πόσους αριθμούς έχει κάθε γραμμή, πώς θα γίνει κάτι τέτοιο;
macgyver Δημοσ. 4 Νοεμβρίου 2010 Μέλος Δημοσ. 4 Νοεμβρίου 2010 Η συνάρτηση είναι η ακόλουθη, αλλά δεν παίζει.Κάτι χάνω int read_puzzle(puzzle_type puzzle, int side_length, FILE *out) { char FileName[81],Line[10]; /* needed for user entry of filenames */ int Lines=2,Counter=2; int i=0,j=0; int k[8],m; int ReadFile[8][8]; printf("give filename\n"); scanf("%s",FileName); out =fopen(FileName,"r"); if (out==NULL) { printf("\nError Opening The File..\n"); fclose (out); return 0; } fscanf (out,"%d",&side_length); // ÄéáâÜæïõìå ìüíï ôïí ðñþôï áñéèìü ðïõ printf ("The SideLenght is : %d\n",side_length);//áðïôåëåß ôï side_length while (!feof(out)) { if (Lines==Counter) { m = sscanf (Line,"%d %d %d %d %d %d %d %d",k[0],k[1],k[2],k[3],k[4],k[5],k[6],k[7]); for (i=0; i<m;i++) ReadFile[Lines] = k; Lines++; Counter++; } } printf("\n\n"); fclose (out); return (side_length);
panbit Δημοσ. 4 Νοεμβρίου 2010 Δημοσ. 4 Νοεμβρίου 2010 Δε χρειάζεται να το κάνεις τόσο πολύπλοκο.. διαβάζεις με scanf πχ ένα ένα αριθμό σε μία επανάληψη η οποία θα έχει συνθήκη τερματισμού όταν βρίσκει "\n" δηλαδή τέλος γραμμής. και ταυτόχρονα με ένα απλό counter υπολογίζεις πόσα στοιχεία διάβασες από την κάθε σειρά. και επίσης καλύτερα να κάνεις δυναμική δέσμευση γιατί πολύς χώρος πάει χαμένος έτσι.
macgyver Δημοσ. 4 Νοεμβρίου 2010 Μέλος Δημοσ. 4 Νοεμβρίου 2010 Κάτι πιο απλό int read_puzzle(puzzle_type puzzle, int side_length, FILE *out) { char FileName[81]; /* needed for user entry of filenames */ int counter=0; int i=0,j=0; int ReadFile[10]; printf("give filename\n"); scanf("%s",FileName); out =fopen(FileName,"r"); if (out==NULL) { printf("\nError Opening The File..\n"); fclose (out); return 0; } fscanf (out,"%d",&side_length); // ÄéáâÜæïõìå ìüíï ôïí ðñþôï áñéèìü ðïõ printf ("The SideLenght is : %d\n",side_length);//áðïôåëåß ôï side_length while(!feof(out)) { fscanf(out,"%d",&ReadFile[counter++]); } fclose(out); for (i=0;i<9;i++) // for (j=0;j<side_length;j++) printf("%d\n", ReadFile); return (side_length); } Εδώ πάνω τώρα πως μπορώ να παίξω με 2D πίνακα; Αγαπητέ pinball_elf δοκίμασα τον κώδικά αλλά κατά την εκτέλεση το πρόγραμμα περίμενε και δεν έκανε τίποτα.
Evgenios1 Δημοσ. 5 Νοεμβρίου 2010 Δημοσ. 5 Νοεμβρίου 2010 Με εναν συνδυασμο fscanf & fgetc >#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int mat[8][8]; int x=0,y=0; FILE *f=fopen("e:\\test\\t.txt","r"); while(fscanf(f,"%d",&mat[y][x])!=EOF) { x++; if(fgetc(f)=='\n') { y++; x=0; } } fclose(f); return 0; } και το output
pinball_elf Δημοσ. 5 Νοεμβρίου 2010 Δημοσ. 5 Νοεμβρίου 2010 Πιο απλή η λύση του Evgenios1, είχα σκεφτεί και την fscanf σαν πρώτη λύση, αλλά προτιμώ την sscanf: > #include <stdio.h> int readline(FILE*, char*); int main (void) { int t[8]; int n; int l = 0; int m; int i, j; char line[128]; int a[8][8]; FILE * Fptr; if ( (Fptr = fopen("array_data.dat","r")) == NULL) fprintf(stderr, "ERROR : cannot open file %s for reading!\n", "array_data.dat"); else { while(1) { if ( (n = readline(Fptr, line)) >0) { m = sscanf (line, "%d %d %d %d %d %d %d %d", &t[0], &t[1], &t[2], &t[3], &t[4], &t[5], &t[6], &t[7]); /* m = number of successfully matched and assigned input items from sscanf */ for (j=0; j<m; j++) a[l][j] = t[j]; l++; /* next line */ } else break; } fclose(Fptr); printf("\n"); for (i=0; i<l; i++) { for (j=0; j<m; j++) printf("%d ", a[i][j]); printf("\n"); } } return 0; } int readline(FILE* fstream, char* line) { char c = '\0'; int n = 0; int i = 0; while (c != '\n') { /* read one character at a time */ if ( (i = fread(&c, 1, 1, fstream)) > 0 ) { line[n] = c; n++; } else { line[0] = '\0'; return 0; } } line[n-1] = '\0'; return (n); }
macgyver Δημοσ. 5 Νοεμβρίου 2010 Μέλος Δημοσ. 5 Νοεμβρίου 2010 Αγαπητοί φίλοι, Τελικά αυτό που μου πρότεινε ο Evgenios1 έπαιξε και είναι η πιο απλή λύση. Οφείλω να ομολογήσω πως όλοι σας με βοηθήσατε πάρα πολύ. Σας ευχαριστώ θερμά, να είστε όλοι καλά.
natassa1510 Δημοσ. 14 Νοεμβρίου 2010 Δημοσ. 14 Νοεμβρίου 2010 γεια σας παιδια εχω και εγω μια απορια σε κατι παρομοιο. εστω οτι εχω το txt αρχειο. χρησιμοποιω την read. πως μπορω αποθηκευσω τους αριθμους αυτους σε ενα πινακα αλλα με 2 ψηφια για τον καθε αριθμο δλδ 01 06 00 08 02 04 09 11 12 int read(puzzle_type puzzle, FILE *out) { char filename[81]; int k,m,s; printf("give filename\n"); scanf("%s",filename); out = fopen(filename,"r"); if (out==NULL) { printf("\nError Opening The File..\n"); fclose (out); return 0; } fscanf(out, "%d", &s); for(k = 0; k < s; k++){ for(m = 0; m < s; m++) fscanf(out,"%d", &puzzle[k][m]); } fclose(out); }
thanos713 Δημοσ. 14 Νοεμβρίου 2010 Δημοσ. 14 Νοεμβρίου 2010 Δεν έχω καταλάβει τι θες να κάνεις ακριβώς και πού κολλάνε τα ορίσματα της συνάρτησης...
natassa1510 Δημοσ. 14 Νοεμβρίου 2010 Δημοσ. 14 Νοεμβρίου 2010 θελω απο ενα αρχειο txt με ακεραιους της μορφης 1 6 0 8 2 4 9 11 12 να τους διαβασω και να τους αποθηκευσω σε ενα πινακα αλλα τους μονοψηφιους με δυο ψηφια δηλαδη αντι για 1 να ειναι 01 αντι για 6 06 η συναρτηση ειναι μερος ολοκληρης της ασκησης που προσπαθω να λυσω
thanos713 Δημοσ. 14 Νοεμβρίου 2010 Δημοσ. 14 Νοεμβρίου 2010 Μα δεν χρειάζεται να τους αποθηκεύσεις ως 01, 02, κ.λ.π, όταν θες να τους τυπώσεις θα τους τυπώνεις 01, 02, κ.λ.π...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.