J'ai un fichier texte simple chargé dans la mémoire. Je veux lire de la mémoire comme je voudrais lire à partir d'un disque comme ici: mais j'ai un fichier en mémoire. J'ai une adresse en mémoire et une taille de ce fichier. P> Ce que je dois faire pour avoir la même fluidité que de traiter avec le fichier dans le code ci-dessus? P> P>
6 Réponses :
Vous pouvez utiliser iSTringingStream code> pour cela.
Voulez-vous dire (i) Stringstream?
IIRC Istrstream code> a été obsolète.
Cela nécessite que les données soient copiées de la chaîne, dans le tampon de StringStream. La solution de boost suggère donc que @ybungalobill va être plus rapide, mais cette solution fonctionnera, et cela ne dépend pas des bibliothèques externes.
Votre idée est fondamentalement la même chose que NIM. Mais ce VÉIANT crée en fait une copie des données de texte code> dans le fichier
code>. Ainsi, si le texte est énorme (comme le contenu d'un fichier, cela peut être un problème).
Utilisez Boost.iostreams. Spécifiquement basic_array code> A>.
namespace io = boost::iostreams;
io::filtering_istream in;
in.push(array_source(array, arraySize));
// use in
Fonctionnalité déjà prise en charge par la STL, donc pas besoin d'utiliser Boost.
Martin, pouvez-vous expliquer votre mode d'utilisation d'un tableau comme Streambuf en plus de copier à Stringstream?
@Martin: STL n'a rien pour cela, sans effectuer une copie des données. La solution de NIM avait l'air agréable, mais malheureusement en train de regarder la norme, je vois que c'est au plus de "mise en œuvre définie".
PubsetBuf (appelé par SETBUF)
@Martin: Sa carte mémoire tampon, elle devrait être utilisée pour la mise en mémoire tampon pour la lecture et l'écriture de fichiers, des sockets, du clavier, de l'écran, etc. Il n'est pas prévu d'être utilisé comme source de données b >. La norme ne dit pas que l'un des flux devrait conserver les données qui y étaient initialement.
@ybungalobillill: Vous devez lire ce que la documentation sur le tampon de flux dit avec un peu plus de soin. L'utilisation ci-dessus est parfaitement valide.
Vous pouvez faire quelque chose comme les suivants .. puis utilisez-le dans votre Remarque: getline code> appels ... p>
getline code> ne comprend pas la différence DOS / UNIX, de sorte que le \ r est inclus dans le texte, c'est pourquoi je le chombis! p>
C'est ce que je cherche! Où mettre cette adresse et cette adresse dans istringstream code>. Mais cela ne fonctionne pas avec
getline code> ... J'ai vérifié ce tampon et sa gamme de caractères et de nouvelles lignes est "\ r \ n" style windows. Donc, le tampon est ok. Je ne sais pas quoi faire pour obtenir ces lignes.
Un problème avec ce code: il n'est pas garanti de travailler. L'effet de pubsetbuf code> sur
basic_streambuf code> est "défini par la mise en œuvre". Il s'attend également à un pointeur non-Const, il peut donc modifier les données pointues sur
Portback code>.
@ybungalobillill: mal, correct et correct sur les deux points. Mais toujours non pertinent. PubsetBuf (appelé par SETBUF)
@Martin: C'est le caractère tampon b>, il devrait être utilisé pour la mise en mémoire tampon de lecture et de rédaction de fichiers, de sockets, de claviers, d'écran, etc., il n'est pas attendu b> être utilisé comme source de données. La norme ne dit pas que l'un des flux devrait conserver les données qui y étaient initialement.
Merci pour de grandes réponses! En fait, le code ci-dessus ne fonctionne pas. Je l'ai testé avec simple \ n code> pas '\ r \ n'. Il fonctionne lors de la compilation avec GCC sur Linux mais pas dans Visual Studio 2010 B>. Depuis que je dois écrire sur Windows (écrire, c'est-à-dire add-on), cela ne me convient pas. Je pense que l'utilisation de Boost n'est pas une option. Je n'aime pas ajouter d'autres bibliothèques pour cette tâche "simple". Le fichier est assez gros (257 Ko), donc je préférerais ne pas le copier à la chaîne, puis transmettez-le à
Istringstream code>.
@ Cichyk24: ce n'est pas censé fonctionner. Ce n'est pas garanti par la norme. Voir Stackoverflow.com/Questtions/4349778/... Pour plus de détails. Donc, la meilleure chose à faire si vous ne voulez pas copier et i> veulent l'utiliser comme source d'un flux, est d'utiliser Boost.
Utilisez
std::stringstream
Voici comment je le ferais:
#include <sstream> std::istringstream stream("some textual value"); std::string line; while (std::getline(stream, line)) { // do something with line }
J'ai trouvé une solution qui fonctionne sur VC ++ depuis NIM solution fonctionne uniquement sur le compilateur GCC (grand merci, cependant. Grâce à votre réponse, j'ai trouvé d'autres réponses qui m'a aidé!
Il semble que d'autres personnes ont problème similaire aussi. J'ai fait exactement comme ici et ici . p>
pour lire à partir d'un morceau de mémoire, comme formez un iStream, vous devez le faire: p> edit: strong> et si Vous avez "\ r \ n 'nouvelles lignes faire comme NIM a écrit: p> if (*line.rbegin() == '\r') line.erase(line.end() - 1);
J'écris, c'est-à-dire un complément et une efficacité, il est crucial de sorte qu'il ne ressort donc pas une fenêtre qui suggère de le désactiver car il est lent. Si j'écrivais une application «normale» bien sûr, cela ne me dérangerait pas de bibliothèques externes :)
Voir: Tenu-à-lisant-Lecture-Contenu-In- Istringingstream et Simple-Way-Create-Create-Create-AC-Taille T-Taille T-avec Out-Copie-Th