2010-12-30 10 views
5
string text; 
getline(text.c_str(),256); 

1) Recibo un error "Error: ninguna función coincidente para la llamada a 'getline (const char *, int)" ¿Qué hay de malo en lo anterior ya text.c_str() devuelve también una puntero a la matriz de caracteres.getline en istream y getline en basic_string

Si escribo como esto

char text[256] 
cin.getline(text, 256 ,'\n'); 

que trabaja muy bien. ¿Cuál es la diferencia entre cin.getline y getline?

2) ¿Cómo es que

text string; 
getline(cin,text,'\n') 

acepta toda la línea que la entrada. ¿Dónde está el puntero a la matriz de caracteres en este?

+2

Supongo que quiere decir 'string text;' not 'text string;'. – aschepler

+2

Una pregunta por pregunta, por favor. – aschepler

Respuesta

5

text.c_str() devuelve constchar *. Usted no puede usarlo para modificar el contenido de la cadena, de ninguna manera. Solo existe para que pueda pasar los datos de cadena a las antiguas funciones de la API C sin tener que hacer una copia. No está permitido realizar cambios porque no hay manera de que el objeto de cadena que contiene los datos pueda encontrarlos, y por lo tanto esto le permitiría romper las invariantes de la cadena.

Además, std::getlineacepta parámetros completamente diferentes. (Usted sabría esto si tardara dos segundos en escribir 'std :: getline' en Google.) El error significa exactamente lo que dice: "no hay función de coincidencia para la llamada" significa que "no se puede llamar a la función con este tipo de parámetros ", porque cada sobrecarga de la función acepta algo diferente (e incompatible).

std::getline acepta estos parámetros:

  • Una corriente. Tienes que pasar esto porque de lo contrario no sabe dónde leer.
  • Un objeto de cadena para leer.NOT a char buffer.
  • Opcionalmente, un delimitador de línea char (igual que la función de miembro getline de secuencia).

No existe realmente ninguna función como "cin.getline". Lo que está llamando es la función de miembro "getline" del objeto "cin" - una variable global que se define para usted cuando #include <iostream>. Normalmente nos referimos a esto de acuerdo a la clase en que se define la función - por lo tanto, std::istream::getline.

std::istream::getline acepta estos parámetros:

  • A char buffer.
  • Opcionalmente, un delimitador de línea char.

No necesita un parámetro de secuencia porque es una función miembro de la secuencia: utiliza la secuencia con la que lo hayamos llamado.

1

text.c_str() es una colección de const caracteres. El const significa que ni usted ni ninguna función (incluido ningún tipo de getline) pueden escribir en él.

No existe una forma portátil de usar un string como una matriz de caracteres grabable. Sin embargo, cuando es necesario, se puede utilizar un vector<char> lugar:

std::vector<char> buffer(256); 
std::size_t len = cin.getline(&buffer[0], buffer.size()); 
std::string text(&buffer[0], len); 

pero sólo usar la sobrecarga de stringgetline es probablemente el mejor aquí.

1

string::c_str() devuelve un const char *, no un char *. getline obras con una cadena, así que lo que queremos es

string text; 
getline(cin, text, '\n'); 

Esta versión de getline permite a la cadena a crecer tanto como sea necesario. Si necesita limitarlo a una cierta cantidad de caracteres, necesitará usar un vector<char> como en la respuesta anterior.

3

Realmente no obtengo lo que el que pregunta está tratando de hacer.

C++ permite la sobrecarga de funciones, por lo que el compilador está buscando una función gratuita llamada getline que corresponden con los parámetros que se han pasado, y no existe tal función, ni debe existir (lo que habría getline(const char*, int) hacer de todos modos?)

Muchas veces se ha preguntado por qué getline(istream&, string&) es una función "gratuita" y no forma parte de la interfaz iostream. Las respuestas sugeridas han sido que iostream desactualiza STL o que iostream no depende de la clase basic_string (en cualquier lugar, que es también la razón por la que abrir archivos está hecho con punteros crudos), y Herb Sutter recomendaría hacer que getline funcione libremente porque se siente miembro de la clase las funciones deben ser mínimas (y std :: string tiene demasiadas, por ejemplo, las funciones de búsqueda que podrían ser gratuitas y que usan la clase).

Sin embargo, una característica de esta función es lo útil que es, ya que no es necesario asignar previamente un búfer y "adivinar" qué tan grande es para hacerlo. (Una vez dicho esto, si lees de un archivo grande a un std :: string, ¡podrías bad_alloc si no hay líneas nuevas!).

Cuestiones relacionadas