789 votes

Lire un fichier ligne par ligne en utilisant ifstream en C++.

Le contenu de file.txt est :

5 3
6 4
7 1
10 5
11 6
12 3
12 4

5 3 est une paire de coordonnées. Comment traiter ces données ligne par ligne en C++ ?

Je suis capable d'obtenir la première ligne, mais comment puis-je obtenir la ligne suivante du fichier ?

ifstream myfile;
myfile.open ("file.txt");

6voto

Universus Points 326

Cette réponse est pour visual studio 2017 et si vous voulez lire à partir d'un fichier texte quel emplacement est relatif à votre application console compilée.

Placez d'abord votre fichier texte (test.txt dans ce cas) dans votre dossier solution. Après la compilation, gardez le fichier texte dans le même dossier que applicationName.exe.

C:\Users\ "nom d'utilisateur" \source\repos\ "solutionName"\"solutionName"

#include <iostream>
#include <fstream>

using namespace std;
int main()
{
    ifstream inFile;
    // open the file stream
    inFile.open(".\\test.txt");
    // check if opening a file failed
    if (inFile.fail()) {
        cerr << "Error opeing a file" << endl;
        inFile.close();
        exit(1);
    }
    string line;
    while (getline(inFile, line))
    {
        cout << line << endl;
    }
    // close the file stream
    inFile.close();
}

5voto

Vijay Bansal Points 509

Bien qu'il ne soit pas nécessaire de fermer le fichier manuellement, c'est une bonne idée de le faire si la portée de la variable du fichier est plus grande :

    ifstream infile(szFilePath);

    for (string line = ""; getline(infile, line); )
    {
        //do something with the line
    }

    if(infile.is_open())
        infile.close();

0 votes

Pas sûr que cela méritait un vote négatif. L'OP a demandé un moyen d'obtenir chaque ligne. Cette réponse le fait et donne un bon conseil pour s'assurer que le fichier se ferme. Pour un programme simple, ce n'est peut-être pas nécessaire, mais c'est au moins une excellente habitude à prendre. Il pourrait peut-être être amélioré en ajoutant quelques lignes de code pour traiter les lignes individuelles qu'il tire, mais dans l'ensemble, c'est la réponse la plus simple à la question de l'OP.

3voto

mjr2000 Points 92

Il s'agit d'une solution générale pour charger des données dans un programme C++, qui utilise la fonction readline. Elle pourrait être modifiée pour les fichiers CSV, mais le délimiteur est ici un espace.

int n = 5, p = 2;

int X[n][p];

ifstream myfile;

myfile.open("data.txt");

string line;
string temp = "";
int a = 0; // row index 

while (getline(myfile, line)) { //while there is a line
     int b = 0; // column index
     for (int i = 0; i < line.size(); i++) { // for each character in rowstring
          if (!isblank(line[i])) { // if it is not blank, do this
              string d(1, line[i]); // convert character to string
              temp.append(d); // append the two strings
        } else {
              X[a][b] = stod(temp);  // convert string to double
              temp = ""; // reset the capture
              b++; // increment b cause we have a new number
        }
    }

  X[a][b] = stod(temp);
  temp = "";
  a++; // onto next row
}

-3voto

Alex Spencer Points 170

Avec des arguments de ligne de commande :

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include "print.h"

using namespace std;

int main (int argc, char *argv[]) {

vector<string> list;

ifstream in_stream;

string line;

in_stream.open(argv[1]);

while(!in_stream.eof())
{
    in_stream >> line;
    list.push_back(line);
}

in_stream.close();

print(list);

sort(list.begin(), list.end());

print(list);

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X