Προς το περιεχόμενο

C++ Αρχεία


vasiliis

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω ένα πρόγραμμα κ αποθηκεύω δεδομένα σε αρχείο.Αποθεκεύονται όλα κανονικά αλλά όταν το ξανατρέξω ξαναδημιουργείται το αρχείο με τα αρχικά δεδομένα.Πώς γίνεται να κρατάει τα τροποποιημένα δεδομένα;

Δημοσ.

Χωρίς να δείξεις κώδικα (έστω, τα σημεία του κώδικα στα οποία ανοίγεις και γράφεις στο αρχείο), δε μπορεί να δοθεί συγκεκριμένη απάντηση.

 

Δες π.χ. εδώ ένα παλιότερο μήνυμα που υπήρχε αντίστοιχο πρόβλημα, αλλά σε C, και στα αμέσως επόμενα μηνύματα την εξήγηση.

Δημοσ.

>
#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;
}

 

Όταν το τρέξω και δώσω όνομα και επώνυμο,το αρχείο κρατάει μόνο αυτό που του δίνω και το γιώργος δημητρίου "χάνεται".

Δημοσ.

Όταν το τρέξω και δώσω όνομα και επώνυμο,το αρχείο κρατάει μόνο αυτό που του δίνω και το γιώργος δημητρίου "χάνεται".

Είναι το C++-ανάλογο της περίπτωσης που παρέθεσα στο προηγούμενο μήνυμά μου.

 

Όταν καλείς την ofstream::open, πέρνα και το κατάλληλο flag για να ανοίξεις το αρχείο σε "append" mode:

 

>
outfile.open("onomata.txt", ios_base::app);

Δημοσ.

ωραία κατάλαβα thnx :) να ρωτήσω και κάτι άλλο.αν έχουμε μία συνάρτηση με την οποία εισάγουμε επώνυμο για να αλλάξουμε το παπαδημητρίου τι πρέπει να κάνουμε για να μην κρατάει και το παπαδημητρίου;

Δημοσ.

Ρίξε μια ματιά στο παρακάτω 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;

Δημοσ.

Λάθος δικό μου, 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;
}

Δημοσ.

Στην ουσία το παραπάνω ανοίγει ένα αρχείο, το κρατάει στην μνήμη, αλλάζει το "lol" με το "roffles" και γράφει ξανά όλο τα πάντα (με τις αλλαγές σε ένα δεύτερο αρχείο. Δεν ξέρω που ακριβώς θέλεις να το χρησιμοποιήσεις στον κώδικα σου. Μπορείς να το κάνεις όμως σαν μια function με 3 ορίσματα (όνομα αρχείου, κείμενο προς αντικατάσταση, νέο κείμενο) και να το καλείς όποτε το θέλεις.

Δημοσ.

Η λύση του computeras13 δουλεύει καλά αλλά σε μεγάλα αρχεία ή με συχνές αλλαγές θα πρέπει να διαβάζεις - τροποποιείς - γράφεις μεγάλα block, κάτι το οποίο θα επιβαρύνει πολύ το I/O του δίσκου.

Δοκίμασε είτε να κάνεις την πρώτη λύση που πρότεινε (επιτόπου έρευνα και τροποποίηση μέσα στο αρχείο) ή να φορτώσεις από την αρχή όλο το αρχείο στην μνήμη, ότι τροποποίηση θέλεις να την κάνεις εκεί και στο τέλος να γράφεις συνολικά το αρχείο...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...