vasiliis Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Έχω ένα πρόγραμμα κ αποθηκεύω δεδομένα σε αρχείο.Αποθεκεύονται όλα κανονικά αλλά όταν το ξανατρέξω ξαναδημιουργείται το αρχείο με τα αρχικά δεδομένα.Πώς γίνεται να κρατάει τα τροποποιημένα δεδομένα;
V.I.Smirnov Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Αυτό που ρωτάς δεν έχει νόημα. Αφού όπως λες "αποθηκεύονται όλα κανονικά", τα τροποποιημένα δεδομένα τα έχει κρατήσει. -
parsifal Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Χωρίς να δείξεις κώδικα (έστω, τα σημεία του κώδικα στα οποία ανοίγεις και γράφεις στο αρχείο), δε μπορεί να δοθεί συγκεκριμένη απάντηση. Δες π.χ. εδώ ένα παλιότερο μήνυμα που υπήρχε αντίστοιχο πρόβλημα, αλλά σε C, και στα αμέσως επόμενα μηνύματα την εξήγηση.
vasiliis Δημοσ. 18 Ιανουαρίου 2011 Μέλος Δημοσ. 18 Ιανουαρίου 2011 > #include<iostream> #include<string.h> #include<cstring> #include<ctype.h> #include<stdlib.h> #include<iomanip> #include<fstream> using namespace std; class onomata { public: string onoma,eponimo; onomata(); }onomata[10]; onomata::onomata() { onoma=""; eponimo=""; } int main() { int i; ofstream outfile; ifstream infile; outfile.open("onomata.txt"); onomata[0].onoma="giorgos"; onomata[0].eponimo="dimitriou"; outfile<<onomata[0].onoma <<endl; outfile<<onomata[0].eponimo <<endl; outfile.close(); cout<<"dwse onoma:"; cin>>onomata[1].onoma; cout<<"dwse eponimo:"; cin>>onomata[1].eponimo; outfile.open("onomata.txt"); outfile<<onomata[1].onoma <<endl; outfile<<onomata[1].eponimo <<endl; outfile.close(); system("pause"); return 0; } Όταν το τρέξω και δώσω όνομα και επώνυμο,το αρχείο κρατάει μόνο αυτό που του δίνω και το γιώργος δημητρίου "χάνεται".
parsifal Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Όταν το τρέξω και δώσω όνομα και επώνυμο,το αρχείο κρατάει μόνο αυτό που του δίνω και το γιώργος δημητρίου "χάνεται". Είναι το C++-ανάλογο της περίπτωσης που παρέθεσα στο προηγούμενο μήνυμά μου. Όταν καλείς την ofstream::open, πέρνα και το κατάλληλο flag για να ανοίξεις το αρχείο σε "append" mode: > outfile.open("onomata.txt", ios_base::app);
computeras13 Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Άλλαξε το >outfile.open("onomata.txt"); με >outfile.open("onomata.txt", ios::app); Edit: Με πρόλαβαν.
vasiliis Δημοσ. 18 Ιανουαρίου 2011 Μέλος Δημοσ. 18 Ιανουαρίου 2011 ωραία κατάλαβα thnx να ρωτήσω και κάτι άλλο.αν έχουμε μία συνάρτηση με την οποία εισάγουμε επώνυμο για να αλλάξουμε το παπαδημητρίου τι πρέπει να κάνουμε για να μην κρατάει και το παπαδημητρίου;
computeras13 Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Ρίξε μια ματιά στο παρακάτω snippet κώδικα. Ελπίζω να βοηθήσει. >myfile.open ("test.txt", ios::in | ios::out | ios::app); if (myfile.is_open()) { while( getline(myfile,line) ) { found = line.find(mystring); if (found >= 0) { pos = myfile.tellg(); cout<<pos<<endl; line.replace(found, mystring.size(),replacestring); } } myfile.close(); } else cout << "Unable to open file"; return 0;
vasiliis Δημοσ. 18 Ιανουαρίου 2011 Μέλος Δημοσ. 18 Ιανουαρίου 2011 μου χτυπάει ο compiler στο while "no matching function for".
computeras13 Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Λάθος δικό μου, sorry. Ρίξε μια ματιά στον παρακάτω κώδικα (το προηγούμενο το είχα ξεθάψει από κάτι σημειώσεις μου και λογικά έχει λάθος). >#include <iostream> #include <fstream> #include <string> int main(){ std::ifstream ifile("ifile.txt",std::ios::binary); ifile.seekg(0,std::ios_base::end); long s=ifile.tellg(); char *buffer=new char[s]; ifile.seekg(0); ifile.read(buffer,s); ifile.close(); std::string txt(buffer,s); delete[] buffer; size_t off=0; while ((off=txt.find("lol",off))!=std::string::npos) txt.replace(off,sizeof("lol")-1,"roffles"); std::ofstream ofile("ofile.txt"); ofile.write(txt.c_str(),txt.size()); return 0; }
vasiliis Δημοσ. 19 Ιανουαρίου 2011 Μέλος Δημοσ. 19 Ιανουαρίου 2011 επειδή δεν καταλαβαίνω και πολλά,είναι εύκολο να μου κάνεις τη μετατροπή στον κώδικα που παρέ8εσα;
computeras13 Δημοσ. 19 Ιανουαρίου 2011 Δημοσ. 19 Ιανουαρίου 2011 Στην ουσία το παραπάνω ανοίγει ένα αρχείο, το κρατάει στην μνήμη, αλλάζει το "lol" με το "roffles" και γράφει ξανά όλο τα πάντα (με τις αλλαγές σε ένα δεύτερο αρχείο. Δεν ξέρω που ακριβώς θέλεις να το χρησιμοποιήσεις στον κώδικα σου. Μπορείς να το κάνεις όμως σαν μια function με 3 ορίσματα (όνομα αρχείου, κείμενο προς αντικατάσταση, νέο κείμενο) και να το καλείς όποτε το θέλεις.
MitsakosGR Δημοσ. 19 Ιανουαρίου 2011 Δημοσ. 19 Ιανουαρίου 2011 Η λύση του computeras13 δουλεύει καλά αλλά σε μεγάλα αρχεία ή με συχνές αλλαγές θα πρέπει να διαβάζεις - τροποποιείς - γράφεις μεγάλα block, κάτι το οποίο θα επιβαρύνει πολύ το I/O του δίσκου. Δοκίμασε είτε να κάνεις την πρώτη λύση που πρότεινε (επιτόπου έρευνα και τροποποίηση μέσα στο αρχείο) ή να φορτώσεις από την αρχή όλο το αρχείο στην μνήμη, ότι τροποποίηση θέλεις να την κάνεις εκεί και στο τέλος να γράφεις συνολικά το αρχείο...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.