Brolly Δημοσ. 7 Ιουνίου 2007 Δημοσ. 7 Ιουνίου 2007 Εχω ενα αρχειο οπου στην 1η γραμμη βρισκεται το password και στις απο κατω διαφορες τιμες καταθεσεων (double). Πως θα μπορουσα να παω και να αλλαξω την τιμη κατω απο το password ( δηλαδη την δευτερη τιμη ) ?Το αρχειο ειναι δοδημενο ως εξης : password 2456.656 3576.430 654.62 87634.45 Δοκιμασα να διαβασω εναν εναν τους χαρακτηρες του αρχειο μεσα σε ενα loop me fgetc και οταν βρει '\n' (Carr. Return) ανεβαζει εναν μετρητη που μετραει τα chars που διαβασε.Κανω μετα fseek(file,ΜΕΤΡΗΤΗΣ,SEEK_SET); για να παει στην γραμμη κατω απο το password.κανω μετα fprintf(file,"%lf",variable); αλλα ακομη παει το γραφη στο τελος του αρχειου... οχι εκει που βρισκεται η fseek.To αρχειο το ανοιγο με "a+".
Legionnaire Δημοσ. 7 Ιουνίου 2007 Δημοσ. 7 Ιουνίου 2007 Μπορείς να κάνεις τα εξής: α) να διαβάζεις όλο το αρχικό αρχείο μέσα σε ένα buffer και στην συνέχεια να κάνεις overwrite το αρχικό αρχείο (άνοιγμα με "w+") με τα περιεχόμενα του buffer μόνο που αμέσως μετά το password θα εισάγεις την τιμή που θες και μετά θα συνεχίζεις με τα υπόλοιπα στοιχεία του buffer. ή β) να ξεκινήσεις να αντιγράφεις το αρχικό αρχείο σε ένα tmp αρχείο, μόλις φτάσεις στο σημείο που θες (π.χ. αμέσως μετά το password) να εισάγεις την τιμή που θες και ύστερα να συνεχίζεις με τους υπόλοιπους χαρακήρες του αρχικού αρχείου. Στο τέλος το αρχείο tmp θα πρέπει να αντικαταστήσει το παλιό (αρχικό) αρχείο. Ελπίζω να έγινα κατανοητός.
Brolly Δημοσ. 8 Ιουνίου 2007 Μέλος Δημοσ. 8 Ιουνίου 2007 μπορεις να μου εξηγησεις λιγο με κωδικα γιατι το παλεψα χτες αρκετη ωρα αλλα δεν τα καταφερα.
bokarinho Δημοσ. 9 Ιουνίου 2007 Δημοσ. 9 Ιουνίου 2007 Ο παρακάτω κώδικα σου δίνει λύση στο πρόβλημα σου. Επειδή δεν έχω χρόνο να εξηγώ επακριβώς το τι κάνει για ότι θέλεις στείλε και θα σου απαντήσω. > //Bokarinho version saving to files and reading from them, bugs always included. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #define SIZE 9 //Global Structures. typedef struct { char *password; float number1; float number2; float number3; }Record; //Function Prototypes. int ReadRecordFromFile(char *filename, Record *record); Record *InitRecord(); void DestroyRecord(Record *r); int WriteRecordToFile(char *filename , Record *rec); void CleanRecord(Record *r); int OpenAndEditFile(char *fin, char *fout); //Main(). int main(int argc, char *argv[]) { Record *r = InitRecord(); ReadRecordFromFile("project.txt",r); printf("Record read from file was:\n Password: %s\n Numbers : %f , %f , %f.\n",r->password,r->number1,r->number2,r->number3); CleanRecord(r); //printf("Now to write something to a file.\n"); //printf("Give me the password to save to file: "); //scanf("%s",r->password); //printf("Now give me the numbers to store separated by spaces: "); //scanf("%f %f %f",&r->number1,&r->number2,&r->number3); //if(!WriteRecordToFile("output.txt",r)) //printf("You made it, check the new file in the Debug folder of visual studio.\n"); //OR if(!OpenAndEditFile("project.txt","new.txt")) printf("You made it, check the new file in the Debug folder of visual studio.\n"); DestroyRecord(r); printf("Hit any key to continue.\n"); getch(); return 0; } //Functions. Record *InitRecord() { Record *record = (Record*)malloc(sizeof(Record)); if(record) { record->password = malloc(SIZE); if(record->password) { record->number1 = 0.0; record->number2 = 0.0; record->number3 = 0.0; return record; } else { perror("malloc"); return NULL; } } else return NULL; } void CleanRecord(Record *r) { if(r) { memset(r->password,0,sizeof(r->password)); r->number1 = 0.0; r->number2 = 0.0; r->number3 = 0.0; } } void DestroyRecord(Record *r) { if(r) { free(r->password); free(r); r = NULL; } } int ReadRecordFromFile(char *filename, Record *record) { if(filename && record) { FILE *fp = fopen(filename,"r"); if(fp) { return fscanf(fp,"%s %f %f %f\n",record->password,&record->number1,&record->number2,&record->number3) == 4 ? 0 : -1; } else { perror("file"); DestroyRecord(record); return -2; } fclose(fp); } else return -3; } int WriteRecordToFile(char *filename , Record *rec) { if(filename && rec) { FILE *fp = fopen(filename,"w"); if(fp) { fprintf(fp,"%s\n%f\n%f\n%f\n",rec->password,rec->number1,rec->number2,rec->number3); return 0; } else { perror("file"); DestroyRecord(rec); return -1; } fclose(fp); } else return -2; } int OpenAndEditFile(char *fin, char *fout) { if(fin && fout) { Record *r = InitRecord(); if(r) { if(!ReadRecordFromFile(fin,r)) { float value = 0; printf("Give me the value that you want to change: "); scanf("%f",&value); r->number1 = 0; r->number1 = value; if(!WriteRecordToFile(fout,r)) { DestroyRecord(r); return 0; } else { printf("Error did not write to file.\n"); return -1; } } else { printf("Error did not read from file.\n"); return -2; } } else { perror("Record"); return -3; } } else { perror("Files"); return -4; } } Φιλικά Bokarinho!!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.