¿Cómo leer línea por línea o un archivo de texto completo a la vez?

86

Estoy en un tutorial que presenta archivos (cómo leer y escribir desde \ a un archivo)

En primer lugar, esto no es una tarea, es solo ayuda general que estoy buscando.

Sé cómo leer una palabra a la vez, pero no sé cómo leer una línea a la vez o cómo leer todo el archivo de texto.

¿Qué pasa si mi archivo contiene 1000 palabras? No es práctico leer cada palabra.

Mi archivo de texto llamado (Leer) contiene lo siguiente:

Amo jugar juegos Amo leer Tengo 2 libros

Esto es lo que he logrado hasta ahora:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

  ifstream inFile;
  inFile.open("Read.txt");

  inFile >>

¿Existe alguna forma posible de leer todo el archivo a la vez, en lugar de leer cada línea o cada palabra por separado?

Mody
fuente
4
Hay respuestas bien definidas aquí: stackoverflow.com/questions/551082/c-read-lines-from-file
sampson-chen
Leer palabra por palabra es solo un poco más lento que línea por línea. Si realmente necesita palabras, entonces es mejor leer palabras. Lea las líneas si está tratando con datos orientados a líneas como un archivo CSV.
@Arkadiy eso es incorrecto. Para un archivo de 100 MiB, leer línea por línea fácilmente tomará segundos, mientras que leer un bloque de 4 KiB a la vez segundos menos de un segundo.
Vallentin
@Vallentin: Dado que todos los flujos están almacenados en búfer, la lectura real del disco ya se realiza bloque por bloque. El resto es simplemente manipular datos en la memoria.

Respuestas:

161

Puede utilizar std::getline:

#include <fstream>
#include <string>

int main() 
{ 
    std::ifstream file("Read.txt");
    std::string str; 
    while (std::getline(file, str))
    {
        // Process str
    }
}

También tenga en cuenta que es mejor simplemente construir el flujo de archivos con los nombres de archivo en su constructor en lugar de abrir explícitamente (lo mismo ocurre con el cierre, simplemente deje que el destructor haga el trabajo).

Se std::string::getline()puede leer más documentación sobre en CPP Reference .

Probablemente, la forma más fácil de leer un archivo de texto completo es simplemente concatenar esas líneas recuperadas.

std::ifstream file("Read.txt");
std::string str;
std::string file_contents;
while (std::getline(file, str))
{
  file_contents += str;
  file_contents.push_back('\n');
}  
111111
fuente
9
Aunque no es obvio, while(getline(f, line)) { ...}realmente es la forma recomendada de hacer esto. Esto se explica aquí: gehrcke.de/2011/06/… --- allí también encontrará enfoques útiles para el manejo adecuado de errores.
Dr. Jan-Philip Gehrcke
1
El código anterior no se compilará sin#include <iostream>
Tyguy7
@ Tyguy7 ¿Por qué sería #include <iostream>necesario? Me parece que <fstream>ya <string>son suficientes. Si quieres decir std::getline, está dentro <string>, no dentro <iostream>.
Fabio dice Reincorporar a Monica
@FabioTurati No estoy seguro, solo sé que una vez que lo incluí, todo se compiló bien.
Tyguy7
19

Sé que este es un hilo realmente antiguo, pero también me gustaría señalar otra forma que en realidad es realmente simple ... Este es un código de muestra:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {

    ifstream file("filename.txt");
    string content;

    while(file >> content) {
        cout << content << ' ';
    }
    return 0;
}
usuario2673553
fuente
2
Buena respuesta, usé esto con un stringstream en lugar de cout para obtener todo el archivo en un stringstream gigante
bjackfly
5

Creo que podrías usar la función istream .read (). Puede simplemente hacer un ciclo con un tamaño de fragmento razonable y leer directamente en el búfer de memoria, luego agregarlo a algún tipo de contenedor de memoria arbitrario (como std :: vector). Podría escribir un ejemplo, pero dudo que desee una solución completa; por favor avíseme si necesita información adicional.

Bartek Banachewicz
fuente
No sé quién votó negativamente esta respuesta, pero esto es bueno, puede ser que no sea de sus estándares, pero uso lo mismo
Javasist
4

Bueno, para hacer esto, también puede usar la función freopen provista en C ++ - http://www.cplusplus.com/reference/cstdio/freopen/ y leer el archivo línea por línea de la siguiente manera -:

#include<cstdio>
#include<iostream>

using namespace std;

int main(){
   freopen("path to file", "rb", stdin);
   string line;
   while(getline(cin, line))
       cout << line << endl;
   return 0;
}
AnkitSablok
fuente
1

Otro método que aún no se ha mencionado es std::vector.

std::vector<std::string> line;

while(file >> mystr)
{
   line.push_back(mystr);
}

Luego, simplemente puede iterar sobre el vector y modificar / extraer lo que necesita /

Bugster
fuente
4
La vectores un paso innecesario. Podría iterar sobre el ifstreamusing std::istream_iterator<std::string>(inFile).
Joseph Mansfield
0

también puede usar esto para leer todas las líneas en el archivo una por una y luego imprimir i

#include <iostream>
#include <fstream>

using namespace std;



bool check_file_is_empty ( ifstream& file){
    return file.peek() == EOF ;
}

int main (){


    string text[256];
    int lineno ;
    ifstream file("text.txt");
    int num = 0;

    while (!check_file_is_empty(file))
    {    
        getline(file , text[num]);
        num++;
    }
    for (int i = 0; i < num ; i++)
    {
        cout << "\nthis is the text in " <<  "line " << i+1 << " :: " << text[i] << endl ;


    }
    
    system("pause");

    return 0;
}

Espero que esto pueda ayudarte :)

Amirhosein Roshan
fuente
0

hola hermano esta es una forma de leer la cadena en la línea exacta usando este código

Espero que esto pueda ayudarte !

#include <iostream>
#include <fstream>

using namespace std;


int main (){


    string text[1];
    int lineno ;
    ifstream file("text.txt");
    cout << "tell me which line of the file you want : " ;
    cin >> lineno ; 



    for (int i = 0; i < lineno ; i++)
    {
        
        getline(file , text[0]);

    }   

    cout << "\nthis is the text in which line you want befor  :: " << text[0] << endl ;
    system("pause");

    return 0;
}

Buena suerte !

Amirhosein Roshan
fuente