¿Puedo abrir un ifstream
(o configurar uno existente de alguna manera) para que solo lea parte de un archivo? Por ejemplo, me gustaría que mi ifstream
lea un archivo del byte 10 al 50. Buscar en el puesto 0 sería la posición 10 en realidad, leer la posición anterior 40 (50 en realidad) sería resualt en un EOF
, etc. ¿Es esto posible? ¿de cualquier manera?leer parte de un archivo con iostreams
Respuesta
Definitivamente se puede hacer implementando un buffer de flujo de filtrado: obtendrá de std::streambuf
y tomará el rango que desea exponer y el buffer de flujo subyacente (bueno, un puntero) como argumentos. Entonces buscarías la ubicación de inicio. Una función underflow()
reemplazada leería desde el almacenamiento intermedio de flujo subyacente en su memoria intermedia hasta que haya consumido tantos caracteres como se deseaba. Aquí es una versión algo áspero y no probado por completo:
#include <streambuf>
struct rangebuf: std::streambuf {
rangebuf(std::streampos start,
size_t size,
std::streambuf* sbuf):
size_(size), sbuf_(sbuf)
{
sbuf->seekpos(start, std::ios_base::in);
}
int underflow() {
size_t r(this->sbuf_->sgetn(this->buf_,
std::min<size_t>(sizeof(this->buf_), this->size_));
this->size -= r;
this->setg(this->buf_, this->buf_, this->buf_ + r);
return this->gptr() == this->egptr()
? traits_type::eof()
: traits_type::to_int_type(*this->gptr());
}
size_t size_;
std::streambuf* sbuf_;
};
Se puede utilizar un puntero a una instancia de este búfer de la secuencia de initialuze un std::istream
. Si es una necesidad recurrente, puede crear una clase derivada de std::istream
configurando el búfer de secuencia en su lugar.
Puede leer los bytes que desea en una cadena o matriz char, luego puede usar esa cadena con una cadena istringstream, y usar eso en lugar de su ifstream. Ejemplo:
std::ifstream fin("foo.txt");
fin.seekg(10);
char buffer[41];
fin.read(buffer, 40);
buffer[40] = 0;
std::istringstream iss(buffer);
for (std::string s; iss >> s;) std::cout << s << '\n';
Si tiene que manejar archivos binarios, se puede hacer eso también:
std::ifstream fin("foo.bin", std::ios::binary | std::ios::in);
fin.seekg(10);
char buffer[40];
fin.read(buffer, 40);
std::istringstream(std::string(buffer, buffer+40));
Es posible que desee poner en práctica su propia clase lector corriente (preferiblemente a través de alguna de las interfaces ifstream si es que existe) .
- 1. Boost iostreams: ¿Cómo crear una secuencia TCP tamponada (para leer)?
- 2. Leer un archivo de texto con php
- 3. ¿Puedo leer un archivo .TXT con PHP?
- 4. ¿Cómo leer un archivo XML con Java?
- 5. ¿Cómo puedo leer un archivo con Ruby?
- 6. Abrir y leer un archivo con askopenfilename
- 7. ¿Está bien usar iostreams con int como character-type?
- 8. C++ iostreams y python
- 9. Cómo leer un archivo dentro de un Jar con JRuby
- 10. ¿Puede aumentar iostreams leer y comprimir archivos gzip sobre la marcha?
- 11. Cómo cambiar el tamaño del búfer con boost :: iostreams?
- 12. Cómo leer un archivo pim.vol
- 13. Leer solo una parte de un archivo del disco en Object-C
- 14. Quitar parte de un nombre de archivo con mv
- 15. leer un archivo binario (pitón)
- 16. Actualizar solo parte de un archivo binario con C++
- 17. ¿Cómo escribir y leer un archivo con un HashMap?
- 18. Uso de boost :: iostreams :: tee_device?
- 19. ¿Alguien puede dar un ejemplo de búsqueda, lectura y escritura de un archivo de> 4 GB con boost iostreams
- 20. Leer en filas específicas, coincidentes con patrones de un archivo
- 21. ¿Cómo puedo leer línea por línea usando la interfaz Boost IOStreams para archivos Gzip?
- 22. ¿Cómo leer un archivo .properties dentro de un archivo .xsl?
- 23. ¿Cómo leer un archivo de un archivo jar?
- 24. jquery - ¿Leer un archivo de texto?
- 25. Leer carrozas de un archivo .txt
- 26. GUNZIP/Extraiga el archivo "parte por parte"
- 27. ¿Cómo leer un CD como un archivo?
- 28. Leer recursos de un archivo DLL
- 29. Leer un archivo de la aplicación web
- 30. ¿Cómo leer bits de un archivo?
Cabe señalar que esta solución solo funcionará con archivos de texto. –
@KhaledNassar: Se puede adaptar fácilmente para trabajar con archivos binarios. Hecho. –
Un problema con este enfoque es que el enfoque que debe leerse puede ser bastante grande. Claro que si de verdad es tremendo es posible que desee cuidar el rango por separado de todos modos. –