Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : buffer [ Windows / Autre ] (nidhaletec)

samedi 14 juin 2008 à 15:18:20 | buffer

nidhaletec

est ce que c vrai que je dois utiliser un buffer pour me placer dans un fichier à partir d un programme en C++ en prenant comme référence de placement un mot déjà  éxistant dans le fichier ?
si oui je cherche des ressources qui m éxplique .

samedi 14 juin 2008 à 22:20:51 | Re : buffer

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Bin non, tu n'es pas obligé d'utilisé un buffer : tu peux utiliser seekg. Quoique cela peux aider côté perfs.

Vala un exemple :

// load a file into memory
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdlib.h>
using namespace std;
/**
 * Renvoie la taille d'un fichier.
 *
 * Le stream doit être ouvert en binary.
 *
 * @param is Stream du fichier dont on souhaite connaître la taille.
 * @return La taille du fichier.
 */
int GetFileSize(ifstream& is)
{
  int nCurrentPos;   // Position courante dans le stream
  int nLength;       // Taille du stream
  // Sauvegarde de la postion actuelle pour restitution
  nCurrentPos = is.tellg();
  // On va en fin de fichier
  is.seekg (nCurrentPos, ios::end);
  // La position courante est la taille du fichier
  nLength = is.tellg();
  // Restitution de la position originale
  is.seekg(nCurrentPos, ios::beg);
  return nLength;
}
/**
 * Recherche une chaîne dans un stream.
 *
 * La recherche commence à partir de la position courante.
 * Le flux est mis en place près à lire la chaîne trouvée.
 *
 * @param is Stream dans lequel rechercher la chaîne.
 * @param s Chaîne à rechercher dans le stream.
 * @return true si le mot à été trouvé, false sinon.
 */
bool FindInFile(ifstream &is, string s)
{
  int nLength;        // Taille du fichier
  char * lpBuffer;    // Tampon de lecture
  int nCurrentPos;    // Position courante dans le fichier
  // Si recherche d'une chaîne vide, on sort
  if (s.size() < 1) return true;
  // Sauvegarde de la postion actuelle pour restitution
  nCurrentPos = is.tellg();
  // Allocation d'un buffer de la taille du mot recherché
  lpBuffer = new char [s.size() + 1];
  // Récupération de la taille du fichier
  nLength = GetFileSize(is);
  // Tant que l'on peut lire autant de caractère qu'il y en a dans la chaîne
  while ((nLength - nCurrentPos) >= (int)s.size())
  {
    is.read(lpBuffer, s.size());
    // Mise en place d'un zéro terminal pour la comparaison
    lpBuffer[s.size()] = '\0';
    // Si les chaînes sont identiques
    if (! strcmp(lpBuffer, s.c_str()))
    {
      // On retourne au début de la chaîne
      is.seekg(nCurrentPos, ios::beg);
      delete[] lpBuffer;
      return true;
    }
    // Il faut avancer caractère par caractère
    nCurrentPos++;
    is.seekg(nCurrentPos, ios::beg);
  }
  // Restitution de la position originale
  delete[] lpBuffer;
  return false;
}
string FindWord(string fileName, string s)
{
  int nLength;
  char * lpBuffer;
  string result;
  // Allocation d'un buffer de la taille du mot recherché
  lpBuffer = new char [s.size() + 1];
  // Ouverture du fichier
  ifstream is;
  is.open(fileName.c_str(), ios::binary);
  if (! is.is_open())
  {
    delete[] lpBuffer;
    throw "Echec de l'ouverture du fichier " + fileName;
  }
  // Récupération de la taille du fichier
  nLength = GetFileSize(is);
  // Recherche du mot
  if (FindInFile(is, s))
  {
    // Récupération du mot pour affichage
    is.read(lpBuffer, nLength);
    lpBuffer[s.size()] = '\0';
    result = lpBuffer;
    delete[] lpBuffer;
    is.close();
    return result;
  }
  else
  {
    delete[] lpBuffer;
    is.close();
    throw "Chaîne introvable";
  }
}
int main ()
{
  int result;  // Code de retour du programme
  try
  {
    cout << FindWord("test.txt", "toto") << endl;
    result = 0;
  }
  catch (string s)
  {
    cout << "Problème lors de la récupération du mot situé avant toto dans le fichier test.txt : " << endl << s << endl;
    result = 1;
  }
  system("pause");
  return result;
}

samedi 14 juin 2008 à 23:04:39 | Re : buffer

SAKingdom

Membre Club
Franchement, tant qu'à faire une lecture caractère par caractère, je dirais OUI il est obligatoire d'utiliser un buffer, du moins, si on tient un minimum au performance parce que là...

try/catch OUFFFFF. Jette un coup d'oeil au listing. C'est dégouttant.

Aussi, il a oublié de préciser ici qu'il souhaite écraser le mot trouvé par un autre. Pas le choix de passer par un buffer dans ce cas (surtout si le mot remplaçant est plus long que le mot à remplacer).

C++ (@++)


lundi 16 juin 2008 à 13:15:50 | Re : buffer

rt15

Membre Club Administrateur CodeS-SourceS
Ah tiens il y a au moins une erreur dans ce que j'ai écrit :

Dans GetFileSize :
is.seekg (nCurrentPos, ios::end); -> is.seekg(0, ios::end);



Cette discussion est classé dans : fichier, buffer


Répondre à ce message

Sujets en rapport avec ce message

Transfert d'un fichier d'un ftp [ par header ] Salut,J'ia besion d'aide : pour que tlm puisse comprendre voici mon source : char buffer[DWN_BUFFER]; // c un define 4096unsigned int count = DWN_BUFF Mettre un fichier .exe dans un buffer [ par guiguikun ] Je n'arrive pas a mettre un fichier executable en memoire.sur les 100Ko du fichier, mon buffer ne compte que les 3 premiers octets (caracteres)voici m utiliser l adresse complete pour l ouverture d un fichier [ par gagaet22 ] Bonjour à tous! J utilise la fonction _getcwd pour connaitre l adresse le dossier courant puis je rajoute le nom du fichier que je veux ouvrir. mai envoi fichier via socket [ par elanspeech ] Bonjour,J'ai fait un client/serveur, la communication se passe bien. cependant, je ne parviens pas a envoyer plusieurs fichiers a la suite avec la soc lire le contenu d'un fichier tel qu'il est [ par ibti25 ] Bonjour,Je m'arrive pas a afficher le contenu de mon fichier comme il est au niveau d'un terminal.Ce que me fait mon code (cidessous), c'est un affich ecrire dans un fichier [ par bellionl ] salut,voila depuis une semaine je tente de conprendre le c++ avec borland c++ builderle problème est quand je veut écrire dans un fichier.création du Ajouter du texte dans un fichier [ par malik7934 ] Hello,Je me demande s'il est possible d'ajouter du texte à la fin d'un fichier sans devoir d'abord l'ouvrir en lecture, le lire dans un buffer, concat Les pointeurs, aide SVP [ par jb60 ] Bonjour,J'ai fait une source avec plusieurs fichier *.cpp et plusieurs fichiers *.hDans un fichier main.cpp, j'ai créé un pointeur BYTE *LesOctets;Je Comparer une ligne d'un fichier avec la précédente [ par boudafc ] Voilà, j'ai un fichier où toutes les lignes sont en double.Ce que je voulais faire, c'est comparer une ligne par rapport à la précédente, mais voilà, WebCam dans un buffer [ par aztcaLISS ] Salut, Je voudrais savoir comment faire pour prendre l'image de la webcam et l'enregistrer dans un buffer. Je voudrais que ça fasse un peu comme la


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.