2010-10-11 38 views
19

Quiero leer un archivo txt línea por línea y después de leer cada línea, quiero dividir la línea de acuerdo con la pestaña "\ t" y agregar cada parte a un elemento en una estructura.C++ Leer archivo línea por línea y luego dividir cada línea usando el delimitador

mi estructura es de 1 * y 2 * Char int

struct myStruct 
{ 
    char chr; 
    int v1; 
    int v2; 
} 

donde CHR puede contener más de un carácter.

Una línea debe ser algo como:

randomstring TAB number TAB number NL 
+7

un char no puede contener más de un carácter, probablemente signifique char * también el propósito de v1 y 2 no es del todo claro para mí. – flownt

+0

@flownt: sí, es mi culpa. – sikas

+4

Entonces, ¿qué te detiene? –

Respuesta

24

Probar:
Nota: si CHR puede contener más de 1 carácter a continuación, utilizar una cadena para representarla.

std::ifstream file("plop"); 
std::string line; 

while(std::getline(file, line)) 
{ 
    std::stringstream linestream(line); 
    std::string   data; 
    int     val1; 
    int     val2; 

    // If you have truly tab delimited data use getline() with third parameter. 
    // If your data is just white space separated data 
    // then the operator >> will do (it reads a space separated word into a string). 
    std::getline(linestream, data, '\t'); // read up-to the first tab (discard tab). 

    // Read the integers using the operator >> 
    linestream >> val1 >> val2; 
} 
2
std::ifstream in("fname"); 
while(in){ 
    std::string line; 
    std::getline(in,line); 
    size_t lasttab=line.find_last_of('\t'); 
    size_t firsttab=line.find_last_of('\t',lasttab-1); 
    mystruct data; 
    data.chr=line.substr(0,firsttab).c_str(); 
    data.v1=atoi(line.substr(firsttab,lasttab).c_str()); 
    data.v2=atoi(line.substr(lasttab).c_str()); 
} 
+0

este código da salida inválida !! – sikas

+1

Busque por qué no usarla como condición del ciclo. –

3

A menos que tenga la intención de utilizar también esta estructura para C, reemplazaría la intención * con std :: cadena.

A continuación, como pretendo ser capaz de leerla de una corriente que iba a escribir la siguiente función:

std::istream & operator>>(std::istream & is, myStruct & my) 
{ 
    if(std::getline(is, my.str, '\t')) 
     return is >> my.v1 >> my.v2; 
} 

con str como el miembro std :: string. Esto escribe en su estructura, usando tabulador como el primer delimitador y luego cualquier delimitador de espacio en blanco antes de los siguientes dos enteros. (Puede forzarlo a usar la pestaña).

Para leer línea por línea, puede continuar leyéndolas o leer la línea primero en una cadena, luego colocar la cadena en una cadena istring y llamar a la anterior.

Deberá decidir cómo manejar las lecturas fallidas. Cualquier lectura fallida anterior dejaría la transmisión en un estado fallido.

Cuestiones relacionadas