fonsde Δημοσ. 12 Νοεμβρίου 2009 Δημοσ. 12 Νοεμβρίου 2009 Καλησπέρα, λοιπόν έχω μια κλάση >class Letter { int type; char street[20]; int streetNumber; public: Letter() { type=rand()%3; streetNumber=rand()%100; strcpy(street, ); ??? } ~Letter() int gettype() const { return type; } char getstreet() const { return street[20]; } int getstreetNumber() const { return streetNumber; } ??? }; είναι σωστό το char street[20]? Θέλω να αποθηκεύεται εκεί μια διεύθυνση. Ακόμα θέλω αυτή η διεύθυνση να διαβάζετε από ένα street.txt αρχείο, και να τη τοποθετώ στο street[20]. Πως μπορώ να το κάνω αυτό? το street.txt περιέχει 1 διεύθυνση σε κάθε σειρά, και εγώ θέλω να παίρνει μια διεύθυνση στη τύχη από όλες αυτές. έχω και αυτά αλλά είναι για να διαβάζει την 1η σειρά >void loadstreets() { char line [20]; FILE *fp; if((fp = fopen("streets.txt", "r")) == NULL) { printf("Error: Can't find the specified file.\n"); return;} readline(fp,line); } void readline(FILE *fp, char line[]) { char c; int pos = 0; while(1) { fscanf(fp, "%c", &c); if(c == '\n' || pos>=199 || feof(fp)) break; line[pos++] = c; } line[pos] = '\0'; }
Evgenios1 Δημοσ. 12 Νοεμβρίου 2009 Δημοσ. 12 Νοεμβρίου 2009 Δηλαδη το προβλημα σου δεν ειναι κλαση αλλα το πως θα διαβασεις μια τυχεα σειρα απο ενα αρχειο? ΥΓ Βαλε ενα σωστο τιτλο..
fonsde Δημοσ. 12 Νοεμβρίου 2009 Μέλος Δημοσ. 12 Νοεμβρίου 2009 αυτό που είπες και αν έχω γράψει σωστά τις δηλώσεις char street[20]; και το char getstreet() const { return street[20]; } και πως θα κάνω string copy την τυχαία διεύθυνση.
Evgenios1 Δημοσ. 12 Νοεμβρίου 2009 Δημοσ. 12 Νοεμβρίου 2009 Για να παρεις μια τυχεα σειρα απο ενα αρχειο, πρεπει να ξερεις ποσες σειρες εχει. Δηλαδη πρεπει να φτιαξεις μια συναρτηση η οποια θα μετραει τα '\n' Αφου εχεις τον αριθμο απο τις σειρες, προσπερνας χ σειρες και περνεις αυτη που θελεις. >#include "stdafx.h" int count(FILE *f); int getline(int idx,char *buf,FILE *f); int gotoline(int idx,FILE *f); int _tmain(int argc, _TCHAR* argv[]) { FILE *f= fopen("E:\\test.txt","r"); int rnd = rand() % count(f); char *buf = new char[128]; getline(rnd,buf,f); printf("%s",buf); fclose(f); getchar(); return 0; } int count(FILE *f) { int result = 0; char c = 0; do { c=fgetc(f); if(c=='\n') result++; }while(c!=EOF); return result; } int getline(int idx,char *buf,FILE *f) { fseek(f,0,SEEK_SET); if(gotoline(idx,f)==1) return fscanf(f,"%[^\n]s",buf); else return -1; } int gotoline(int idx,FILE *f) { fseek(f,0,SEEK_SET); int count = 0; char c = 0; do { c = fgetc(f); if(c == '\n') { count++; if(count==idx) return 1; } }while(c!= EOF); return -1; }
fonsde Δημοσ. 12 Νοεμβρίου 2009 Μέλος Δημοσ. 12 Νοεμβρίου 2009 thnx μόνο πες μου στο σημείο return fscanf(f,"%[^\n]s",buf); το [^\n] τι κάνει? αφαιρεί από το string to \n ?
3c0r1z Δημοσ. 13 Νοεμβρίου 2009 Δημοσ. 13 Νοεμβρίου 2009 Μιας και μιλάμε για C++ πρόγραμμα καλύτερα να χρησιμοποιείς την string κλάση αντί για char*, δηλαδή: > #include<string> class Letter { // ... std::string street; //... public: // Αν θες κάποια αρχική τιμή για την μεταβλητή street χωρίς να έχει // ορίσματα ο constructor. Letter() : street("some street") { type=rand()%3; streetNumber=rand()%100; } // ... std::string GetStreet() const { return street; } // ... }; Είναι πιο εύκολα στην χρήση και δεν χρειάζεται να σε απασχολεί το μέγεθος της συμβολοσειράς.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.