2013-07-23 6 views
-1

j'ai un tamponcomment lire une chaîne particulière d'un tampon

char buffer[size]; 

que j'utilise pour stocker le contenu du fichier d'un flux (supposons pStream ici)

HRESULT hr = pStream->Read(buffer, size, &cbRead); 

maintenant j'ai tout le contenu de ce flux dans un tampon qui est de taille (supposons la taille ici). Maintenant, je sais que j'ai deux chaînes

"<!doctortype html" and ".html>" 

qui sont présents quelque part (nous ne faisons pas leurs loctions) à l'intérieur du contenu stocké de ce tampon et je veux seulement stocker le contenu de la mémoire tampon de l'emplacement

"<!doctortype html" to another string ".html>" 

dans un autre buffer2 [SizeWeDontKnow] pour le moment.

Comment faire ça ??? (En fait le contenu de ces deux emplacements est le contenu d'un fichier html et je veux stocker le contenu du seul fichier html présent dans ce tampon). des idées comment faire ça ??

Répondre

1

Vous pouvez utiliser la fonction strnstr pour trouver la bonne position dans votre tampon. Une fois que vous avez trouvé les balises de début et de fin, vous pouvez extraire le texte à l'aide de strncpy ou l'utiliser si les performances sont problématiques.
Vous pouvez calculer la taille nécessaire à partir des positions des balises et la longueur de la première balise
nLength = nPosEnd - nPosStart - nStartTagLength

+0

est-ce que visual C++ supporte la fonction strnstr si vous avez une idée ??? et qu'est-ce que nStartTagLength? comme je l'ai compris vous nLength est la taille du contenu total html et nPosStart = "" nous avons juste besoin de cela pourquoi vous avez utilisé nStartTagLength ??? – Sss

+0

Visual C++ n'a pas strnstr, mais si vous n'êtes pas sûr que la fonction Read vous donne une chaîne terminée par zéro, vous pouvez y mettre vous-même le zéro: 'char buffer [size + 1]; ZeroMemory (tampon, taille + 1); ' nPosStart et nPosEnd sont les positions de l'étiquette de début" ". nStartTagLength est la longueur de "

+0

alors connaissez-vous la fonction équivalente pour le C++ visuel? et pensez-vous que je peux l'intégrer en utilisant strtok() ici? - tandis que (pch! = NULL) { pch = strtok (NULL, "racle html!" retour 0, } puis-je obtenir la position de "racle html!" En utilisant ce – Sss

0

Recherchez les analyseurs HTML pour C/C++.

Une autre façon est d'avoir un pointeur de char à partir du début de la mémoire tampon, puis vérifier chaque caractère après. Voyez si cela suit votre exigence.

+0

Je suis interessé par la deuxième idée mais pourriez-vous s'il vous plaît me dire qu'en faisant le pointeur de caractère je peux comparer juste un caractère à la fois mais je dois comparer une chaîne pleine qui est de la taille égale à la taille de ** " Sss

+0

'& buffer' est le pointeur vers votre zone tampon. Maintenant, créez un autre pointeur char sous la forme 'char * b = & buffer'. Maintenant, b pointe vers le début du tampon et vous pouvez le déplacer et ne pas perdre votre tampon. Maintenant, si le premier caractère de votre tampon est '<', alors '* b' est '<'. Continuez à incrémenter b et vous pouvez lire un caractère à la fois. Maintenant continuez à comparer à la chaîne que vous voulez, et vous avez ce que vous voulez. –

0

Êtes-vous limité à C, ou pouvez-vous utiliser C++?

Dans la référence de la bibliothèque C il y a beaucoup de façons utiles de chaînes de tokenising et la comparaison des résultats (string.h):

http://www.cplusplus.com/reference/cstring/

en C++ je ferais les éléments suivants (en utilisant des variables tampons et taille à partir de votre code):

// copy char array to std::string 
    std::string text(buffer, buffer + size); 

    // define what we're looking for 
    std::string begin_text("<!doctortype html"); 
    std::string end_text(".html>"); 

    // find the start and end of the text we need to extract 
    size_t begin_pos = text.find(begin_text) + begin_text.length(); 
    size_t end_pos = text.find(end_text); 

    // create a substring from the positions 
    std::string extract = text.substr(begin_pos,end_pos); 

    // test that we got the extract 
    std::cout << extract << std::endl; 

Si vous avez besoin de compatibilité de chaîne C vous pouvez utiliser:

char* tmp = extract.c_str(); 
+0

J'utilise Visual C++. Pensez-vous que strtok est bon pour moi parce que je dois chercher l'emplacement de "" et ensuite stocker le contenu entre eux. que suggérez-vous ? – Sss

+0

J'ai mis à jour ma réponse avec un exemple C++ que j'ai testé avec le compilateur g ++: g ++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3). Faites-moi savoir si cela fonctionne pour vous –

+0

@Simson je l'avais fait le 24 juillet.Maintenant, il est plus de 2 semaines .. – Sss

0

Si c'est la seule opération qui fonctionne sur le code HTML dans votre application, vous pouvez utiliser la solution que je fournis ci-dessous (vous pouvez également le tester en ligne - here). Cependant, si vous allez faire une analyse plus compliquée, alors je suggère d'utiliser une bibliothèque externe.

#include <iostream> 
#include <cstdio> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    const char* beforePrefix = "asdfasdfasdfasdf"; 
    const char* prefix = "<!doctortype html"; 
    const char* suffix = ".html>"; 
    const char* postSuffix = "asdasdasd"; 

    unsigned size = 1024; 
    char buf[size]; 
    sprintf(buf, "%s%sTHE STRING YOU WANT TO GET%s%s", beforePrefix, prefix, suffix, postSuffix); 

    cout << "Before: " << buf << endl; 

    const char* firstOccurenceOfPrefixPtr = strstr(buf, prefix); 
    const char* firstOccurenceOfSuffixPtr = strstr(buf, suffix); 

    if (firstOccurenceOfPrefixPtr && firstOccurenceOfSuffixPtr) 
    { 
     unsigned textLen = (unsigned)(firstOccurenceOfSuffixPtr - firstOccurenceOfPrefixPtr - strlen(prefix)); 
     char newBuf[size]; 
     strncpy(newBuf, firstOccurenceOfPrefixPtr + strlen(prefix), textLen); 
     newBuf[textLen] = 0; 

     cout << "After: " << newBuf << endl; 
    } 

    return 0; 
} 

EDIT Je reçois maintenant :). Vous devez utiliser strstr pour trouver la première occurrence du prefix puis. J'ai édité le code ci-dessus, et mis à jour le link.

+0

sans connaître l'emplacement du préfixe et suffixe je ne peux pas obtenir les données entre eux de sorte que "la chaîne que vous voulez obtenir" n'est pas possible je pense que vous ne pouviez toujours pas tand ma question. – Sss

+0

Oui, vous avez raison, j'ai manqué ce détail. Je viens de mettre à jour la réponse :) – podkova

+0

alors avez-vous une idée d'obtenir l'emplacement en visuel C++ ?? en cwe peut faire en utilisant strnstr mais pas ici..toutes les idées ?? – Sss

Questions connexes