2011-04-25 65 views
10

Estoy tratando de usar std :: getline, pero mi compilador me dice que Getline no está identificado?std no tiene ningún miembro 'getline'?

#include <iostream> 
#include <cstdio> 
#include <cmath> 
#include <cstring> 
#include <fstream> 
#include <cstdlib> 

int main(){ 
    using namespace std; 
    string line; 
    ifstream ifile("test.in"); 
    if(ifile.is_open()){ 
     while(ifile.good()){ 
      getline(ifile,line); 
     } 
    } 
} 

Respuesta

20

std::getline se define en la cabecera string.

#include <string> 

Además, su código no está usando cualquier cosa, desde cstring, cstdio, cmath o cstdlib; ¿Por qué molestarse en incluir estos?

EDIT: Para aclarar la confusión respecto a la cstring y string cabeceras, cstring tira de los contenidos de de la biblioteca de tiempo de ejecución Cstring.h en el std espacio de nombres; string es parte de la C++ estándar biblioteca y contiene getline, std::basic_string<> (y sus especializaciones std::string y std::wstring), etc. - dos mismas encabezados diferentes.

+0

Eso fue fácil. ;] – karlphillip

+0

Pensé que cstring y string eran lo mismo, pero cstring era para C++? – pighead10

+3

@Pig Head: 'cstring' es para C-in-C++. Define todas las antiguas funciones de cadena C ('strlen', etc.) en el espacio de nombres' std'. – cHao

3

Como Ildjarn señala, la función se declara en <string>, y yo estoy sorprendido de que no se produce un error en:

string line; 

Además, este:

while(ifile.good()){ 
     getline(ifile,line); 
} 

no es la forma de escribir un ciclo de lectura. DEBE probar el éxito de la operación de lectura, no el estado actual de la transmisión. Desea:

while(getline(ifile,line)) { 
} 
+0

Esto es viejo, lo sé, pero pensé que me gustaría responder y decir que el método anterior para el ciclo de lectura rompe la regla cardinal de programación de "Asignación en condición" que arrojará un error si se usan estándares estrictos. tiempo ((getline (iFile, línea)! == false) { . . . } sería mejor – CrazyMerlin

Cuestiones relacionadas