Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 02 Ιαν 2012 23:45

Καταρχήν Καλή Χρονιά σε όλους, με υγεία, αγάπη και ένα 2012.. Πως ήταν το 2011 ->Καμία Σχέση :-) !

Έχω μια εργασία που πρέπει να υλοποιηθεί στην C .
1)Ο χρήστης πρέπει να δώσει την διαδρομή από ένα αρχείο text π.χ. C:\myfile.txt
2)To πρόγραμμα πρέπει να ανοίγει το αρχείο αυτό.
3)Το αρχείο θα περιέχει δεδομένα στην εξής δομή:
______________________
A B C D E
A 32 54 3 5 74
B 42 89 21 0 34
C 7 9 21 20 59
D 4 23 53 54 8
E 51 72 83 74 29
_______________________
4)Σε αυτό το στάδιο το πρόγραμμα πρέπει να ελέγξει γραμμή - γραμμή, και να κάνει αντικατάσταση των γραμμάτων όπου ο αριθμός είναι μεγαλύτερος.
Για παράδειγμα στην πρώτη γραμμή ο χαρακτήρας "Α" πρέπει να αντικατασταθεί με τον χαρακτήρα "Ε" λόγο του μεγαλύτερου αριθμού που είναι το 74...
5)Το πρόγραμμα να εξάγει τα δεδομένα της συνολικής αντικατάστασης.
π.χ. Εαν ο χρήστης καταχωρούσε το πιο πάνω αρχείο το πρόγραμμα έπρεπε να του εξάγει το ακόλουθο αποτέλεσμα: ΕΒΕDC

*Θεωρείτε δεδομένο ότι ο χρήστης θα δώσει αρχείο στην πιο πάνω μορφή και ως εκ'τούτου δεν απαιτείται έλεγχος.

!Σας ευχαριστώ εκ των προτέρων και κάθε βοήθεια θα μου ήταν πολύτιμη

nkast
Δημοσιεύσεις: 137
Εγγραφή: 15 Νοέμ 2009 20:31
Επικοινωνία:

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από nkast » 03 Ιαν 2012 00:51

1)Σε τι χρησιμευουν τα γραματα μπροστα απο τους αριθμούς;
2)Τι ειδους βοηθεια περιμενεις; κατι σαν λυμένη/έτοιμη απάντηση; Εχεις σκεφτεί καθολου πως θα το κανεις;

MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 03 Ιαν 2012 20:22

καλησπερα!!!τα στοιχεια του αρχειου που εβαλα παραπανω ειναι ενδεικτικα!!
Λοιπον .ΕΧΩ ΕΝΑ ΤΧΤ ΠΟΥ ΑΠΟΤΕΛΕΙΤΑΙ ΑΠΟ 264 ΓΡΑΜΜΕΣ ΚΑΙ 20 ΣΤΗΛΕΣ ΚΑΘΕ ΓΡΑΜΜΗ ΚΑΙ ΣΤΗΛΗ ΑΝΤΙΣΤΟΙΧΕΙ ΣΕ ΕΝΑ ΓΡΑΜΜΑ.ΔΙΑΒΑΖΩΝΤΑΣ ΤΗΝ ΚΑΘΕ ΓΡΑΜΜΗ ΠΡΕΠΕΙ ΝΑ ΒΡΙΣΚΩ ΤΟΝ ΜΕΓΑΛΥΤΕΡΟ ΑΡΙΜΘΟ ΚΑΙ ΝΑ ΑΝΤΙΚΑΘΙΣΤΩ ΤΟ ΓΡΑΜΜΑ ΤΗΣ ΓΡΑΜΜΗΣ ΜΕ ΤΟ ΓΡΑΜΜΑ ΤΗΣ ΣΤΗΛΗΣ.ΑΡΑ ΠΡΕΠΕΙ ΝΑ ΔΙΑΒΑΖΩ ΚΑΘΕ ΓΡΑΜΜΗ ΧΩΡΙΣΤΑ ΚΑΙ ΝΑ ΒΡΙΣΚΩ ΤΟ ΜΕΓΑΛΥΤΕΡΟ ΣΑΝ ΠΡΩΤΟ ΒΗΜΑ ΕΧΩ ΓΡΑΨΕΙ ΕΝΑ ΚΩΔΙΚΑ ΑΛΛΑ ΟΤΑΝ ΤΡΕΧΕΙ ΜΟΘ ΩΓΑΖΕΙ 284 ΓΡΑΜΜΕΣ ΚΑΙ ΟΧΙ 264.



#include <stdio.h>
#include <stdlib.h> /* required for atoi */

int main(void) {
int i=0,totalNums;
int j=0,count=0;
int max,max_index;
double numbers[264][20];
double atof ( const char * str );
char line[100]; /* declare a char array */
FILE *file; /* declare a FILE pointer */
file = fopen("op.txt", "r"); /* open a text file for reading */
while(fgets(line, sizeof line, file)!=NULL) { /* keep looping until NULL pointer... */
printf("%dLines%s",count, line);
numbers[j]=atoi(line); /* convert string to double float*/
count++;

}
fclose(file);
system("pause");
return 0;
}






ΠΩΣ ΜΠΟΡΩ ΝΑ ΒΡΙΣΚΩ ΤΟ ΜΕΓΑΛΥΤΕΡΟ ΑΡΙΘΜΟ ΓΙΑ ΚΑΘΕ ΓΡΑΜΜΗ?
ΔΕ ΜΠΟΡΩ ΝΑ ΤΟ ΚΑΝΩ ΜΕ ΤΙΠΟΤΑ
ΓΝΩΡΙΖΩ ΟΤΙ ΓΙΝΕΤΑΙ ΚΑΠΩΣ ΕΤΣΙ:
for(i=0;i<264;i++)
{
for(j=0;j<20;j++)
{
printf("%d",numbers[j]);
}
printf("\n");
}
printf("\n");

max=0;


for(i=0;i<264;i++)
{
if(numbers[j]>max)
{
max=arr[j];
max_index=i;
}

}

printf("\n\n\t\t\t Maximum number is %d at index %d",max,max_index);


getch();
}
ΤΟ ΘΕΜΑ ΕΙΝΑΙ ΟΤΙ ΠΡΕΠΕΙ ΝΑ ΔΙΑΒΑΖΕΙ ΤΟ ΑΡΧΕΙΟ ΠΡΩΤΑ ΚΑΙ ΜΕΤΑ ΝΑ ΜΟΥ ΕΠΙΣΤΡΕΦΕΙ ΤΟΝ ΜΕΓΑΛΥΤΕΡΟ ΑΡΙΘΜΟ ΚΑΘΕ ΓΡΑΜΜΗΣ ΚΑΙ ΤΗΝ ΘΕΣΗ ΤΟΥ.

ΤΑ ΓΡΑΜΜΑΤΑ ΠΟΥ ΑΝΤΙΣΤΟΙΧΟΥΝ ΣΕ ΚΑΘΕ ΣΤΗΛΗ ΚΑΙ ΚΑΘΕ ΓΡΑΜΜΗ ΠΩΣ ΘΑ ΤΑ ΑΝΤΙΣΤΟΙΧΙΣΩ ΜΕ ΤΟΝ ΠΙΝΑΚΑ?
ΘΑ ΠΟΣΤΑΡΩ ΤΟ ΑΡΧΕΙΟ ΠΟΥ ΔΟΘΛΕΥΩ ΝΑ ΤΟ ΔΕΙΤΕ ΤΟ ΚΑΝΟΝΙΚΟ ΕΙΝΑΙ ΑΥΤΟ ΜΕ ΤΑ ΓΡΑΜΜΑΤΑ ΣΤΟ ΑΛΛΟ ΤΑ ΕΒΓΑΛΑ ΓΙΑ ΝΑ ΜΠΟΡΩ ΝΑ ΤΟ ΕΠΕΞΕΡΓΑΣΤΩ .
ΜΗΠΩΣ ΠΡΕΠΕΙ ΝΑ ΦΤΙΑΧΩ ΠΑΡΑΛΛΗΛΟΥΣ ΠΙΝΑΚΕΣ ΔΗΛ ΕΝΑ ΔΙΣΔΙΑΣΤΑΤΟ ΚΑΙ ΕΝΑ ΜΟΝΟΔΙΣΤΑΤΟ .ΝΟΜΙΖΩ ΟΤΙ ΠΡΕΙΠΕΙ ΝΑ ΔΟΥΛΕΨΩ ΜΕ ΔΕΙΚΤΕΣ.
ΠΑΙΔΙΑ ΟΠΟΙΑ ΒΟΗΘΕΙΑ ΘΑ ΜΟΥ ΗΤΑΝ ΔΕΚΤΗ ΔΕ ΜΠΟΡΩ ΜΕ ΤΙΠΟΤΑ ΝΑ ΒΡΩ ΛΥΣΗ
Συνημμένα
op.txt
(24.64 KiB) Μεταφορτώθηκε 101 φορές
my_pssm.txt
(25.54 KiB) Μεταφορτώθηκε 109 φορές

nkast
Δημοσιεύσεις: 137
Εγγραφή: 15 Νοέμ 2009 20:31
Επικοινωνία:

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από nkast » 03 Ιαν 2012 23:19

καταρχήν DONT PANIC! (κλείσε to caps lock...)
Το πρωτο βήμα είναι να διαβασεις την πρώτη γραμμή σε εναν πίνακα. πχ char letters[];

Τις επόμενες γραμμές θα τις διαβαζεις μια μια.
θα κρατας σε μια μεταβλητή τον μεγαλυτερο αριθμό και ενα index. Αρχικες τιμες: int max=0; int maxIndex=0;int currentIndex=0;
Για καθε αριθμο που διαβαζεις θα αυξάνεις τον currentIndex. Αν o αριθμος ειναι μεγαλύτερος απο τον max, θα ανανεωνεις τον max και τον maxIndex.

Στο τελος, Το γραμμα που αντιστιχει την γραμμή θα ειναι το letters[maxIndex].

To parsing θα ειναι αρκετα επιπονο. Εχετε κανει compilers/lexers/parsers?

MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 04 Ιαν 2012 20:11

#include <stdio.h>

void main()
{
int max, maxp=0,i,j,counter;
static const char filename[] = "op.txt";
FILE *file = fopen ( filename, "r" );


char arra[300][20];
char line[128]; /* or other suitable maximum line size */

for(i=0; i<300; i++)
for(j=0; j<20; j++)
arra[j] = '\0';

for(i=0; i<300; i++)
line = '\0';

if ( file != NULL )
{
counter =0;
int choice;
i=0;
max=arra[0];
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
strcpy(arra, line);
if (counter==0)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==1)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==2)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==3)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==4)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==5)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==6)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==7)
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==8
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==9)
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==10)
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==11)
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==12)
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==13)
{printf("%d array -->%s \n",counter, &arra[i]);}
.
.
.
.

if (counter==269)
{printf("%d array -->%s \n",counter, &arra[i]);}


counter++;
i++;


}
fclose ( file );
}
else
{
perror ( filename );
}
system("pause");
return 0;

}


Με αυτο τον τροπο διαβαζω ανα γραμμη το αρχειο σαν string αλλα εχω κολλησει στο πως θα διαβαζω χαρακτηρα χαρακτηρα και θα βρισκω τον μεγαλυτερο και την θεση του χαρακτηρα στην καθε γραμμη.
καμια ιδεα!!!!

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από gvre » 04 Ιαν 2012 20:40

MamRa έγραψε: if (counter==0)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==1)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==2)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==3)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==4)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==5)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==6)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==7)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==8
{printf("%d array -->%s \n",counter, &arra);}
if (counter==9)
{printf("%d array -->%s \n",counter, &arra);}
if (counter==10)
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==11)
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==12)
{printf("%d array -->%s \n",counter, &arra[i]);}
if (counter==13)
{printf("%d array -->%s \n",counter, &arra[i]);}
.
.
.
.

if (counter==269)
{printf("%d array -->%s \n",counter, &arra[i]);}

Αν ο counter έπαιρνε τιμές μέχρι 1.000.000 θα το έκανες με τον παραπάνω τρόπο; Συνήθως σε τέτοιες περιπτώσεις υπάρχει απλούστερη λύση.

MamRa έγραψε:
4)Σε αυτό το στάδιο το πρόγραμμα πρέπει να ελέγξει γραμμή - γραμμή, και να κάνει αντικατάσταση των γραμμάτων όπου ο αριθμός είναι μεγαλύτερος.
Για παράδειγμα στην πρώτη γραμμή ο χαρακτήρας "Α" πρέπει να αντικατασταθεί με τον χαρακτήρα "Ε" λόγο του μεγαλύτερου αριθμού που είναι το 74...
5)Το πρόγραμμα να εξάγει τα δεδομένα της συνολικής αντικατάστασης.
π.χ. Εαν ο χρήστης καταχωρούσε το πιο πάνω αρχείο το πρόγραμμα έπρεπε να του εξάγει το ακόλουθο αποτέλεσμα: ΕΒΕDC


Λες εδώ ότι το πρόγραμμα πρέπει να εξάγει στη συγκεκριμένη περίπτωση το EBEDC. Αν πρέπει να κάνει μόνο αυτό και όχι καμία αποθήκευση των γραμμάτων σε κάποιο άλλο αρχείο, θα χρειαστείς απλά ένα πίνακα με μέγεθος όσες και οι γραμμές σου, στον οποίο θα αποθηκεύεις το σωστό γράμμα (δε χρειάζεται δηλαδή αντικατάσταση γραμμάτων).

ps. Βάζε τον κώδικα σε code tags (5ο κουμπάκι στην 1η γραμμή) για να διαβάζεται.
ps2. Δες την fscanf
http://www.crasseux.com/books/ctutorial/fscanf.html
http://www.cs.bu.edu/teaching/c/file-io/intro/

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από gvre » 04 Ιαν 2012 21:11

Προτεινόμενες βελτιώσεις

Κώδικας: Επιλογή όλων

void main&#40;&#41; -> int main&#40;void&#41;

Κώδικας: Επιλογή όλων

static const char filename&#91;&#93; = "op.txt"; -> το static δεν έχει νόημα μέσα στη main&#40;&#41;

Κώδικας: Επιλογή όλων

if &#40; file != NULL &#41; -> Καλό είναι ο έλεγχος να γίνεται αμέσως μετά την fopen

Αλλαγή των

Κώδικας: Επιλογή όλων

char arra&#91;300&#93;&#91;20&#93;; 
char line&#91;128&#93;; /* or other suitable maximum line size */ 

for&#40;i=0; i<300; i++&#41; 
for&#40;j=0; j<20; j++&#41; 
arra&#91;i&#93;&#91;j&#93; = '\0'; 

for&#40;i=0; i<300; i++&#41; 
line&#91;i&#93; = '\0'; 
σε

Κώδικας: Επιλογή όλων

char arra&#91;300&#93;&#91;20&#93; = &#123;&#123;0&#125;&#125;; 	// αρχικοποίηση με 0 όλων των στοιχείων
char line&#91;128&#93; = &#123;0&#125;; 		// αρχικοποίηση με 0 όλων των στοιχείων

Κώδικας: Επιλογή όλων

300, 20, 128 -> Magic Numbers. Άλλαξέ τα με defines

Κώδικας: Επιλογή όλων

system&#40;"pause"&#41;; -> getchar&#40;&#41;;

MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 04 Ιαν 2012 23:11

το προβλημα μου ειναι οτι δεν μπορω να διαβασω ενα ενα τους χαρακτηρες σε καθε γραμμη ωστε να βρισκω τον μεγαλυτερο καθε φορα.επισης προσπαθω να εξαγω το αρχειο σε ενα δισδιασταο πινακα εφοσον το διαβαζει για να μπορεσω να το επεξεργαστω και δεν μπορω.Πρεπει να δημιουργησω ενα δισδιασταο πινακα [269][20] και να εισαγω ολα τους αριθμους του txt?Εαν γινει ετσι δεν εχει νοημα να διαβαζει το αρχειο...Αρα το προβλημα ειναι οτι δεν μπορω να το επεξεργαστω το μονο που καταφερα να κανω ειναι να διαβαζω ανα γραμμη τα στοιχεια του αρχειου ....

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από gvre » 05 Ιαν 2012 00:05

Δες το πρόγραμμα που επισυνάπτω. Δεν είναι τέλειο αλλά είναι μια καλή αρχή.
Συνημμένα
data.c
(574 Ψηφιολέξεις) Μεταφορτώθηκε 124 φορές
data.txt
(68 Ψηφιολέξεις) Μεταφορτώθηκε 129 φορές

MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 05 Ιαν 2012 00:52

καταρχην σε ευχαριστω παρα πολυ!!!!!!!!!!!!! :D
θελω να σου κανω μερικες ερωτησεις
το text που χω εχει 269 γραμμες και 20 στηλες το χω ποσταρει παραπανω .
πρεπει στο προγραμμα να τρεχει το αρχειο txt και αυτο πρεπει να φαινετα δηλαδη να μην μου εξαγει μονο την ακολουθία .Δε πρεπει να ορισω ενα πινακα με τα γραμματα που αντιστοιχουνε σε καθε γραμμη πχ char line[20]={ A R N D C Q E G H I L K M F P S T W Y V};
Τελευταία επεξεργασία από το μέλος MamRa την 05 Ιαν 2012 01:33, έχει επεξεργασθεί 1 φορά συνολικά.

MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 05 Ιαν 2012 01:13

δεν καταλαβαινω αυτο το σημειο res[resCurrentIndex] = 'A' + maxIndex;
resCurrentIndex++;

πως βρισκει κα αντικαθιστα τα γραμματα?αφου δεν εχουμε ορισει ποια γραμματ αντιστοιχουν σε καθε στηλη?

MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 05 Ιαν 2012 01:32

"MamRa"]καταρχην σε ευχαριστω παρα πολυ!!!!!!!!!!!!! :D
θελω να σου κανω μερικες ερωτησεις
το text που χω εχει 269 γραμμες και 20 στηλες το χω ποσταρει παραπανω .
πρεπει στο προγραμμα να τρεχει το αρχειο txt και αυτο πρεπει να φαινετα δηλαδη να μην μου εξαγει μονο την ακολουθία ..Δε πρεπει να ορισω ενα πινακα με τα γραμματα που αντιστοιχουνε σε καθε γραμμη πχ char line[20]={ A R N D C Q E G H I L K M F P S T W Y V};

MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 05 Ιαν 2012 02:25

MamRa έγραψε:δεν καταλαβαινω αυτο το σημειο res[resCurrentIndex] = 'A' + maxIndex;
resCurrentIndex++;

πως βρισκει κα αντικαθιστα τα γραμματα?αφου δεν εχουμε ορισει ποια γραμματ αντιστοιχουν σε καθε στηλη?
οκ καταλαβα τι κανεις αλλα αυτο ισχυει για τα γραμματ που ειναι με την σειρα δηλ του αλφαβητου οταν τα γραμματα δεν εχουν σειρα ειναι οπως εδω A R N D C Q E G H I L K M F P S T W Y V τι κανουμε λογικα πρεπει να ορισουμε ενα πινακα και να οριζοθμε την θεση τοθ καθε γραμματος?

MamRa
Δημοσιεύσεις: 29
Εγγραφή: 06 Δεκ 2009 21:07

Εισαγωγή δεδομένων από αρχείο text σε πίνακα

Δημοσίευση από MamRa » 05 Ιαν 2012 03:51

Ευχαριστώ πολύ παιδιά το προβλημα μου λύθηκε !!!!!!!!!!!!!τα ξαναλέμε εάν χρειαστώ κάτι άλλο!!! :D

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες