Pregunta

Estoy en una costumbre C ++ curso acelerado. He conocido a lo básico durante muchos años, pero actualmente estoy tratando de refrescar mi memoria y aprender más. A tal fin, como mi segunda tarea (después de escribir una clase de pila sobre la base de listas enlazadas), estoy escribiendo mi propia clase string.

Se ha ido bastante bien hasta ahora; Quiero sobrecargar el operador >> que puedo hacer cosas como cin >> mi_cadena ;. El problema es que no sé cómo leer la istream correctamente (o tal vez el problema es que no sé arroyos ...). Probé un tiempo (! Stream.eof) () bucle que .read (s) 128 bytes a la vez, pero como era de esperar, se detiene sólo en EOF. Quiero que leer a un salto de línea, al igual que se obtiene con cin >> a un std :: string.

Mi clase string tiene un una función de agregación (const char *) que hace que la parte alloc (nuevo_tam size_t) función que (re) asigna memoria, y, pero es evidente que necesita saber la cantidad de memoria para asignar antes de que pueda escribir en la memoria intermedia.

Cualquier consejo sobre cómo implementar esto? He intentado conseguir la longitud istream con seekg () y tellg (), pero sin éxito (Devuelve -1), y como he dicho bucle hasta EOF (no deja de leer a una nueva línea) la lectura de un pedazo a la vez.

¿Fue útil?

Solución

Para leer caracteres de la corriente hasta el final de la línea de utilizar un bucle.

char c;
while(istr.get(c) && c != '\n')
{
     // Apped 'c' to the end of your string.
}
// If you want to put the '\n' back onto the stream
// use istr.unget(c) here
// But I think its safe to say that dropping the '\n' is fine.

Si se queda sin espacio reasignar el búfer con un tamaño más grande. Copiar los datos a través de y continuar. No es necesario ser de lujo para un proyecto de aprendizaje.

Otros consejos

puede utilizar cin :: getline (tampón *, buffer_size); entonces usted tendrá que comprobar para el mal, EF y fallar banderas:

std :: cin.bad (), std :: cin.eof (), std :: cin.fail ()

a menos que se establecieron mal o EOF, fallará la bandera se establece por lo general indica desbordamiento de búfer, por lo que debe reasignar el búfer y continuar la lectura en el búfer nuevo después de llamar a std :: cin.clear ()

Una nota al margen: En el STL el operador >> de un istream está sobrecargado para proporcionar este tipo de funcionalidad o (como por carbón *) son funciones globales. Tal vez sería más prudente proporcionar una sobrecarga personalizada en lugar de sobrecargar el operador de su clase.

Comprobar la respuesta de Jerry ataúd a esta pregunta .

El primer método que utiliza es muy simple (sólo una clase de ayuda) y permitir que usted escriba su entrada en un std::vector<std::string> donde cada elemento del vector representa una línea de la entrada original.

Eso realmente hace las cosas fáciles cuando se trata de procesamiento después!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top