Comment lire ligne par ligne ou tout un fichier texte à la fois?

86

Je suis dans un tutoriel qui présente les fichiers (comment lire et écrire depuis \ vers un fichier)

Tout d'abord, ce n'est pas un devoir, c'est juste une aide générale que je recherche.

Je sais lire un mot à la fois, mais je ne sais pas lire une ligne à la fois ou comment lire le fichier texte en entier.

Et si mon fichier contient 1 000 mots? Il n'est pas pratique de lire chaque mot.

Mon fichier texte nommé (Read) contient les éléments suivants:

J'adore jouer à des jeux J'adore lire J'ai 2 livres

Voici ce que j'ai accompli jusqu'à présent:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

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

  inFile >>

Existe-t-il un moyen possible de lire le fichier entier à la fois, au lieu de lire chaque ligne ou chaque mot séparément?

Mody
la source
4
Il y a des réponses bien définies ici: stackoverflow.com/questions/551082/c-read-lines-from-file
sampson-chen
La lecture mot par mot n'est que légèrement plus lente que ligne par ligne. Si vous avez réellement besoin de mots, il est préférable de lire des mots. Lisez les lignes si vous avez affaire à des données orientées lignes telles qu'un fichier CSV.
@Arkadiy qui est incorrect. Pour un fichier de 100 Mio, la lecture ligne par ligne prendra facilement quelques secondes, tandis que la lecture d'un bloc de 4 Kio à la fois quelques secondes moins d'une seconde.
vallentin
@Vallentin: Etant donné que les flux sont tous mis en mémoire tampon, la lecture réelle du disque se fait déjà bloc par bloc. Le reste ne fait que manipuler les données en mémoire.

Réponses:

161

Vous pouvez utiliser std::getline:

#include <fstream>
#include <string>

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

Notez également qu'il est préférable de construire simplement le flux de fichiers avec les noms de fichiers dans son constructeur plutôt que de l'ouvrir explicitement (il en va de même pour la fermeture, laissez simplement le destructeur faire le travail).

De plus amples informations sur std::string::getline()peuvent être lues dans la référence CPP .

Le moyen le plus simple de lire un fichier texte entier est probablement de concaténer les lignes récupérées.

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
la source
9
Bien que cela ne soit pas évident, c'est while(getline(f, line)) { ...}vraiment la manière recommandée de le faire. Ceci est expliqué ici: gehrcke.de/2011/06/… --- vous y trouverez également des approches utiles pour une gestion correcte des erreurs.
Dr.Jan-Philip Gehrcke
1
Le code ci-dessus ne sera pas compilé sans#include <iostream>
Tyguy7
@ Tyguy7 Pourquoi serait #include <iostream>nécessaire? Il me semble que <fstream>et <string>sont assez. Si vous voulez dire std::getline, c'est dedans <string>, pas dedans <iostream>.
Fabio dit Réintégrer Monica
@FabioTurati Je ne suis pas sûr, je sais juste qu'une fois que je l'ai inclus, tout s'est bien compilé.
Tyguy7
19

Je sais que c'est un fil vraiment très ancien, mais j'aimerais également souligner une autre manière qui est en fait très simple ... Voici un exemple de code:

#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
la source
2
Bonne réponse, j'ai utilisé ceci avec un stringstream au lieu de cout pour obtenir le fichier entier dans un stringstream géant
bjackfly
5

Je pense que vous pouvez utiliser la fonction istream .read (). Vous pouvez simplement faire une boucle avec une taille de bloc raisonnable et lire directement dans la mémoire tampon, puis l'ajouter à une sorte de conteneur de mémoire arbitraire (tel que std :: vector). Je pourrais écrire un exemple, mais je doute que vous souhaitiez une solution complète; s'il vous plaît laissez-moi savoir si vous avez besoin d'informations supplémentaires.

Bartek Banachewicz
la source
Je ne sais pas qui a décliné cette réponse, mais c'est bien peut-être que je ne suis pas de vos normes mais j'utilise la même chose
Javasist
4

Eh bien, pour ce faire, on peut également utiliser la fonction freopen fournie en C ++ - http://www.cplusplus.com/reference/cstdio/freopen/ et lire le fichier ligne par ligne comme suit -:

#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
la source
1

Une autre méthode qui n'a pas encore été mentionnée est std::vector.

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

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

Ensuite, vous pouvez simplement parcourir le vecteur et modifier / extraire ce dont vous avez besoin /

Bugster
la source
4
Le vectorest une étape inutile. Vous pouvez itérer sur l' ifstreamutilisation std::istream_iterator<std::string>(inFile).
Joseph Mansfield
0

vous pouvez également l'utiliser pour lire toutes les lignes du fichier une par une, puis imprimer 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;
}

j'espère que cela pourrait vous aider :)

Amirhosein Roshan
la source
0

bonjour bro c'est un moyen de lire la chaîne dans la ligne exacte en utilisant ce code

j'espère que cela pourrait vous aider!

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

Bonne chance !

Amirhosein Roshan
la source