Sauvegarder et charger avec cfile

Contenu du snippet

Fonction pour sauvegarder et charger du texte dans un fichier.
La sauvegarde à 2 modes:
-Mode ajouter qui ajoute à la fin du fichier
-Mode remplacer qui remplace le texte existant

La fonction charger permet de charger des fichiers de plusieurs Megs.
Il y a une boucle qui utilise x fois le buffer de la manière suivante:x=(la taille du fichier)/(par la taille du buffer)

Source / Exemple :


int CTotoDlg::Sauvegarder(CString file,CString data,CString mode)
{
//////////////////////////////////////////////////////////////////////////////////////
//Mode Ajouter		mode="Ajouter"		
//Ajoute à la fin du fichier(par defaut)	
//
//Mode Remplacer	mode="Remplacer"   
// Remplace le fichier	
//////////////////////////////////////////////////////////////////////////////////////
	CFile fichier;
	int Verif;
	int OK=0;

//On definit les tab et Enter en format texte	

	CString Enter;
	CString Tab;

	Enter.FormatMessage("\n");
	Tab.FormatMessage("\t");

	
		
	//////////////Mode Ajouter////////////////
	if (mode == "Ajouter")
	{

	CString st;
		
	st=Charger(file);
	st=st.Right(1);
	if(st!='\n')
	{	
		data=Enter+data; 
//on ajoute un entrée (\n) à la fin du fichier s'il n'y en à pas
	}

	Verif=fichier.Open(file,CFile::modeWrite);
//Ouverture du fichier en lecture/écriture 
	if(Verif != 0)
		{
			
			fichier.SeekToEnd();			//aller à la fin du fichier
			fichier.Write(data,data.GetLength()); 	// sauvegarde dans le fichier
			fichier.Close();			// fermeture du fichier
			OK=1;
		}
	}
		
	//////////////Mode Remplacer////////////////
	if (mode == "Remplacer")
	{
			
Verif=fichier.Open(file,CFile::modeCreate |CFile::modeWrite);
//Ouverture du fichier en lecture/écriture et le créer s'il n'existe pas
			if(Verif != 0)
			{	
			fichier.Write(data,data.GetLength()); 	// sauvegarde de la log dans un fichier
			fichier.Close();			// fermeture du fichier
				OK=1;
			}

		}

return OK; //OK=1 si pas de pb OK=0 si pb
}

//////////////////////////////////////////////////////////////////////////////////////
//En fonction du nom du fichier on le charge et on le retourne dans un 
//CString st

CString CTotoDlg::Charger(CString file)
{

	CFile fichier;
	char Buffer[100000];
	int Taille=100000;
	CString st="";
	int Buff;

	int Verif=fichier.Open(file,CFile::modeRead);//Ouverture du fichier en lecture
	if(Verif != 0)
		{
			Buff=int(fichier.GetLength()); 
//On recupere la taille du fichier en octets
			
			do
			{
				if(Buff>Taille) 
//si la taille du fichier est encore > au buffer 
				{
				fichier.Read(Buffer,Taille); 
//on en prend que 100000
				
				CString tmp=Buffer;
				st=st+tmp.Mid(0,Taille);	
//on copie les 100000 dans le cstring
					Buff=Buff-Taille;			//on remet le nombre d'octet à charger
					
				}else
				{
				fichier.Read(Buffer,Buff); 
//si le buffer suffit on le lit
					
				CString tmp=Buffer;
				st=st+tmp.Mid(0,Buff);		//on copie le reste dans le cstring											
					break; 
//on casse la boucle quand on a tout lu
				}

			}while(true);
//boucle infinie tant que le fichier n'est pas chargé entiérement

					
					
		fichier.Close(); // fermeture du fichier

				
		}else
		{
			st="NULL"; //Si problème retourne NULL
		}

return st; // retourne le texte dans un CString

}

Conclusion :


Aide pour ceux qui ont du mal(les autres: désolé pour la trivialité des infos)
Vous pouvez ajouter dans votre projets directement le code
/!\ Il faut renommer CTotoDlg par le nom de votre projet

Ensuite
Il faut ajouter dans votre .h (ex: totoDlg.h) dans la partie (public:):
afx_msg int Sauvegarder(CString file,CString data,CString mode);
afx_msg CString Charger(CString file);

Et maintenant l'utilisation:

exemple d'appel des fonctions
CString texte=Charger("toto.txt");
//texte contient le texte qui était dans toto.txt

CString data="dfhsldfh...dfsf" ou une variable de type CString d'une edit box ou autre ...
Sauvegarder("toto.txt",data,"Ajouter")
// Ca ajoute dfhsldfh...dfsf à la fin du fichier toto
//On peut controler si la fonction a fonctionné avec un int
int ETAT=Sauvegarder("toto.txt",data,"Ajouter")
//si ETAT=1 pas de pb si ETAT=0 il y a eu un problème

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_Sioban)