¿Hay alguna manera de crear un búfer de memoria como un ARCHIVO *. En TiXml puede imprimir el xml a un ARCHIVO * pero no puedo hacer que se imprima en un búfer de memoria.¿Cómo escribir en un búfer de memoria con un ARCHIVO *?
Respuesta
se puede utilizar el método de TiXMLPrinterCStr la que la documentación indica:
El TiXmlPrinter es útil cuando se necesidad de:
- de impresión en la memoria (especialmente en el modo no-STL)
- Formato de control (terminaciones de línea, etc.)
Supongo que la respuesta correcta es la de Kevin. Pero aquí hay un truco para hacerlo con FILE *. Tenga en cuenta que si el tamaño del búfer (aquí 100000) es demasiado pequeño, perderá datos, ya que se escribe cuando se vacía el búfer. Además, si el programa llama a fflush() pierde los datos.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
FILE *f = fopen("/dev/null", "w");
int i;
int written = 0;
char *buf = malloc(100000);
setbuffer(f, buf, 100000);
for (i = 0; i < 1000; i++)
{
written += fprintf(f, "Number %d\n", i);
}
for (i = 0; i < written; i++) {
printf("%c", buf[i]);
}
}
hack genial: ¿alguna idea si es portátil? –
Funciona solo si puede evitar que stdio limpie el búfer, y supongo que los detalles de eso no están estandarizados. –
'setbuf()' y 'setvbuf()' (NO 'setbuffer()') son ISO-C, por lo que * debería * ser portable una vez que los use. Si el modo de bofeteo está completamente amortiguado, debería tratar de llenar el búfer por completo; en Windows, debe usar "NUL" en lugar de "/ dev/null"; también debe abrir el archivo en modo binario "wb" – Christoph
fmemopen puede crear un ARCHIVO desde el búfer, ¿tiene sentido para usted?
me escribió un ejemplo sencillo de cómo me gustaría crear un archivo en memoria:
#include <unistd.h>
#include <stdio.h>
int main(){
int p[2]; pipe(p); FILE *f = fdopen(p[1], "w");
if(!fork()){
fprintf(f, "working");
return 0;
}
fclose(f); close(p[1]);
char buff[100]; int len;
while((len=read(p[0], buff, 100))>0)
printf(" from child: '%*s'", len, buff);
puts("");
}
Hay una manera de POSIX de utilizar la memoria como un descriptor FILE
: fmemopen
o open_memstream
, dependiendo de la semántica que desea buscar: Difference between fmemopen and open_memstream
¡Ni fmemopen, ni open_memstream están definidos en ningún estándar de C/C++! – MFH
@MFH POSIX 200809 – tbert
¡POSIX NO es un estándar C/C++! Es un estándar que depende en gran medida del estándar C, pero, no obstante, solo funciona en un subconjunto de SOs que son compatibles con/desarrollados en C/C++. Sin mencionar que POSIX entra en conflicto con ciertos aspectos de los estándares de C/C++ ... – MFH
C++ basic_streambuf
herencia
En C++, se debe evitar FILE*
si puedes.
Al utilizar solo C++ stdlib, es posible crear una única interfaz que utilice de forma transparente el archivo o la memoria IO.
Este utiliza técnicas mencionadas en: Setting the internal buffer used by a standard stream (pubsetbuf)
#include <cassert>
#include <cstring>
#include <fstream>
#include <iostream>
#include <ostream>
#include <sstream>
/* This can write either to files or memory. */
void write(std::ostream& os) {
os << "abc";
}
template <typename char_type>
struct ostreambuf : public std::basic_streambuf<char_type, std::char_traits<char_type> > {
ostreambuf(char_type* buffer, std::streamsize bufferLength) {
this->setp(buffer, buffer + bufferLength);
}
};
int main() {
/* To memory, in our own externally supplied buffer. */
{
char c[3];
ostreambuf<char> buf(c, sizeof(c));
std::ostream s(&buf);
write(s);
assert(memcmp(c, "abc", sizeof(c)) == 0);
}
/* To memory, but in a hidden buffer. */
{
std::stringstream s;
write(s);
assert(s.str() == "abc");
}
/* To file. */
{
std::ofstream s("a.tmp");
write(s);
s.close();
}
/* I think this is implementation defined.
* pusetbuf calls basic_filebuf::setbuf(). */
{
char c[3];
std::ofstream s;
s.rdbuf()->pubsetbuf(c, sizeof c);
write(s);
s.close();
//assert(memcmp(c, "abc", sizeof(c)) == 0);
}
}
Por desgracia, no parece posible intercambiar FILE*
y fstream
: Getting a FILE* from a std::fstream
- 1. Escribir un búfer binario en un archivo en Python
- 2. En R, ¿cómo trazar en un búfer de memoria en lugar de un archivo?
- 3. Escribir en el búfer de memoria en lugar de archivo con libjpeg?
- 4. C: leer el archivo binario en la memoria, alterar el búfer, escribir el búfer en el archivo
- 5. Cómo comprimir un búfer con zlib?
- 6. cómo escribir en un archivo en emacs
- 7. Enviar archivo escribe en el búfer en memoria (fopen algo, pero escribir para amortiguar, no disco)
- 8. Cómo escribir un servicio WCF con almacenamiento persistente en memoria?
- 9. ¿Cómo escribir un flujo en un archivo?
- 10. ¿Cómo implementar un búfer circular usando un archivo?
- 11. Usando Python, ¿cómo puedo leer/escribir datos en la memoria como lo haría con un archivo?
- 12. Win32: ¿Escribir en el archivo sin almacenamiento en búfer?
- 13. Escribir un archivo en iOS
- 14. ¿Cómo escribir y leer un archivo con un HashMap?
- 15. ¿Cómo escribir en un archivo en PHP?
- 16. Escribir un entero en un archivo con fputs()
- 17. ¿Cómo ver un archivo escribir en PHP?
- 18. Cómo escribir valores vectoriales en un archivo
- 19. ¿Cómo escribir un InputStream potencialmente enorme en un archivo?
- 20. ¿Cómo escribir en un solo archivo con múltiples hilos?
- 21. ¿Cómo escribir un archivo con C en Linux?
- 22. Cómo escribir números enteros en un archivo
- 23. Cómo escribir cadenas unicode en un archivo?
- 24. Generar un búfer LPCM en memoria para AVAudioPlayer initWithData
- 25. ¿Cómo escribir un programa Python eficiente en memoria?
- 26. ¿Escribir NSData en un archivo?
- 27. ¿Cómo abrir un archivo en la memoria?
- 28. ¿Cómo escribir un archivo de video con OpenCV?
- 29. ¿Cómo leer y escribir un HashMap en un archivo?
- 30. Escribir datos de publicaciones en un archivo con PHP
Véase también [Diferencia entre fmemopen y open_memstream] (https: // stackoverflow .com/q/29849749/608639). – jww