c++ - txt - leer archivo linea por linea
C++ Lea el archivo línea por línea y luego divida cada línea usando el delimitador (4)
Quiero leer un archivo txt línea por línea y después de leer cada línea, quiero dividir la línea según la pestaña "/ t" y agregar cada parte a un elemento en una estructura.
mi estructura es 1 * char y 2 * 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
A menos que también intentes usar esta estructura para C, reemplazaría el char * con std :: string.
A continuación, como tengo la intención de poder leerlo desde una secuencia, escribiría 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 espacios en blanco hará antes de los siguientes dos enteros. (Puedes forzarlo a usar pestaña).
Para leer línea por línea, puede continuar leyendo esto o leer primero la línea en una cadena, luego colocar la cadena en una cadena de istring y llamar a la anterior.
Tendrá que decidir cómo manejar las lecturas fallidas. Cualquier lectura fallida anterior dejaría la secuencia en un estado fallido.
He tenido algunas dificultades para seguir algunas de las sugerencias aquí, así que estoy publicando un ejemplo completo de sobrecarga de operadores de entrada y salida para una estructura sobre un archivo delimitado por tabulaciones. Como beneficio adicional, también toma la entrada desde la entrada stdin
o desde un archivo suministrado a través de los argumentos del comando.
Creo que esto es tan simple como se adhiere a la semántica de los operadores.
pareja
#ifndef PAIRWISE_VALUE
#define PAIRWISE_VALUE
#include <string>
#include <iostream>
struct PairwiseValue
{
std::string labelA;
std::string labelB;
float value;
};
std::ostream& operator<<(std::ostream& os, const PairwiseValue& p);
std::istream& operator>>(std::istream& is, PairwiseValue& p);
#endif
pairwise.cc
#include "pairwise.h"
std::ostream& operator<<(std::ostream& os, const PairwiseValue& p)
{
os << p.labelA << ''/t'' << p.labelB << ''/t'' << p.value << std::endl;
return os;
}
std::istream& operator>>(std::istream& is, PairwiseValue& p)
{
PairwiseValue pv;
if ((is >> pv.labelA >> pv.labelB >> pv.value))
{
p = pv;
}
return is;
}
prueba.cc
#include <fstream>
#include "pairwise.h"
int main(const int argc, const char* argv[])
{
std::ios_base::sync_with_stdio(false); // disable synch with stdio (enables input buffering)
std::string ifilename;
if (argc == 2)
{
ifilename = argv[1];
}
const bool use_stdin = ifilename.empty();
std::ifstream ifs;
if (!use_stdin)
{
ifs.open(ifilename);
if (!ifs)
{
std::cerr << "Error opening input file: " << ifilename << std::endl;
return 1;
}
}
std::istream& is = ifs.is_open() ? static_cast<std::istream&>(ifs) : std::cin;
PairwiseValue pv;
while (is >> pv)
{
std::cout << pv;
}
return 0;
}
Compilando
g++ -c pairwise.cc test.cc
g++ -o test pairwise.o test.o
Uso
./test myvector.tsv
cat myvector.tsv | ./test
Tratar:
Nota: si chr puede contener más de 1 carácter, use una cadena para representarlo.
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;
}
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());
}