Como ler linha por linha ou um arquivo de texto inteiro de uma vez?

86

Estou em um tutorial que apresenta arquivos (como ler e escrever de \ para arquivo)

Em primeiro lugar, este não é um dever de casa, é apenas uma ajuda geral que estou procurando.

Sei ler uma palavra de cada vez, mas não sei ler uma linha de cada vez ou como ler todo o arquivo de texto.

E se meu arquivo contiver 1000 palavras? Não é prático ler cada palavra.

Meu arquivo de texto denominado (Ler) contém o seguinte:

Amo jogar jogos adoro ler tenho 2 livros

Isso é o que eu fiz até agora:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

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

  inFile >>

Existe alguma maneira possível de ler todo o arquivo de uma vez, em vez de ler cada linha ou cada palavra separadamente?

Mody
fonte
4
Há respostas bem definidas aqui: stackoverflow.com/questions/551082/c-read-lines-from-file
sampson-chen
possível duplicata de Como ler uma linha de um arquivo de texto em c / c ++?
Adrian McCarthy
Ler palavra por palavra é apenas um pouco mais lento do que linha por linha. Se você realmente precisa de palavras, é melhor ler palavras. Leia as linhas se estiver lidando com dados orientados por linha, como arquivo CSV.
@Arkadiy isso está incorreto. Para um arquivo de 100 MiB, a leitura linha por linha facilmente levará segundos, enquanto a leitura de um bloco de 4 KiB por vez, segundos a menos de um segundo.
Vallentin
@Vallentin: Dado que os streams estão todos em buffer, a leitura real do disco já é feita bloco a bloco. O resto é apenas manipulação de dados na memória.

Respostas:

161

Você pode usar std::getline:

#include <fstream>
#include <string>

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

Observe também que é melhor apenas construir o fluxo de arquivos com os nomes dos arquivos em seu construtor, em vez de abrir explicitamente (o mesmo vale para o fechamento, apenas deixe o destruidor fazer o trabalho).

Mais documentação sobre std::string::getline()pode ser lida em Referência do CPP .

Provavelmente, a maneira mais fácil de ler um arquivo de texto inteiro é apenas concatenar as linhas 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
fonte
9
Embora não seja óbvio, while(getline(f, line)) { ...}realmente é a maneira recomendada de fazer isso. Isso é explicado aqui: gehrcke.de/2011/06/… --- lá você também encontrará abordagens úteis para o tratamento adequado de erros.
Dr. Jan-Philip Gehrcke
1
O código acima não compilará sem#include <iostream>
Tyguy7
@ Tyguy7 Por que #include <iostream>seria necessário? Parece-me isso <fstream>e <string>são suficientes. Se você quer dizer std::getline, está dentro <string>, não dentro <iostream>.
Fabio diz Restabelecer Monica
@FabioTurati Não tenho certeza, só sei que depois de incluí-lo, tudo compilou bem.
Tyguy7
19

Eu sei que este é um tópico realmente muito antigo, mas gostaria também de apontar outra maneira que é realmente muito simples ... Este é um código de amostra:

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

int main() {

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

    while(file >> content) {
        cout << content << ' ';
    }
    return 0;
}
user2673553
fonte
2
Boa resposta, usei isso com um stringstream em vez de cout para transformar todo o arquivo em um stringstream gigante
bjackfly
5

Acho que você poderia usar a função istream .read (). Você pode apenas fazer um loop com um tamanho de bloco razoável e ler diretamente para o buffer de memória e, em seguida, anexá-lo a algum tipo de recipiente de memória arbitrário (como std :: vector). Eu poderia escrever um exemplo, mas duvido que você queira uma solução completa; por favor, deixe-me saber se você precisar de alguma informação adicional.

Bartek Banachewicz
fonte
Eu não sei quem votou contra esta resposta, mas isso é bom pode ser que eu não corresponda aos seus padrões, mas eu uso a mesma coisa
Javasist
4

Bem, para fazer isso também se pode usar a função freopen fornecida em C ++ - http://www.cplusplus.com/reference/cstdio/freopen/ e ler o arquivo linha por linha da seguinte forma -:

#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
fonte
1

Outro método que ainda não foi mencionado é std::vector.

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

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

Então, você pode simplesmente iterar sobre o vetor e modificar / extrair o que você precisa /

Bugster
fonte
4
Essa vectoré uma etapa desnecessária. Você pode iterar ao longo do ifstreamuso std::istream_iterator<std::string>(inFile).
Joseph Mansfield
0

você também pode usar isso para ler todas as linhas do arquivo uma por uma e 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 isto possa te ajudar :)

Amirhosein Roshan
fonte
0

olá mano esta é uma maneira de ler a string na linha exata usando este código

Espero que isto possa te ajudar !

#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;
}

Boa sorte !

Amirhosein Roshan
fonte