web-dev-qa-db-fra.com

Comment lire un fichier texte à partir de la deuxième ligne en utilisant fstream?

Comment faire en sorte que mon objet std::fstream commence à lire un fichier texte à partir de la deuxième ligne?

17
Tal

Utilisez getline () pour lire la première ligne, puis commencez à lire le reste du flux.

ifstream stream("filename.txt");
string dummyLine;
getline(stream, dummyLine);
// Begin reading your stream here
while (stream)
   ...

(Modifié en std :: getline (merci dalle.myopenid.com))

27
Doug T.

Vous pouvez utiliser la fonctionnalité ignore du flux:

ifstream stream("filename.txt");

// Get and drop a line
stream.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );

// Get and store a line for processing.
// std::getline() has a third parameter the defaults to '\n' as the line
// delimiter.
std::string line;
std::getline(stream,line);

std::string Word;
stream >> Word; // Reads one space separated Word from the stream.

Une erreur courante lors de la lecture d'un fichier:

while( someStream.good() )  // !someStream.eof()
{
    getline( someStream, line );
    cout << line << endl;
}

Cela échoue parce que: lors de la lecture de la dernière ligne, il ne lit pas le marqueur EOF. Le flux est donc toujours bon, mais il ne reste plus de données à lire dans le flux. Donc, la boucle est ré-entrée. std :: getline () tente alors de lire une autre ligne de someStream et échoue, mais écrit quand même une ligne dans std :: cout.

while( someStream ) // Same as someStream.good()
{
    getline( someStream, line );
    if (someStream) // streams when used in a boolean context are converted to a type that is usable in that context. If the stream is in a good state the object returned can be used as true
    {
        // Only write to cout if the getline did not fail.
        cout << line << endl;
    }
}
while(getline( someStream, line ))
{
    // Loop only entered if reading a line from somestream is OK.
    // Note: getline() returns a stream reference. This is automatically cast
    // to boolean for the test. streams have a cast to bool operator that checks
    // good()
    cout << line << endl;
}
23
Martin York

Le moyen le plus efficace est d’ignorer les chaînes avec std :: istream :: ignore

for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){
    if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('\n'))){ 
        //just skipping the line
    } else 
        return HandleReadingLineError(addressesFile, currLineNumber);
}

HandleReadingLineError n'est pas standart mais bien sûr fabriqué à la main. Le premier paramètre est le nombre maximum de caractères à extraire. Si c'est exactement numeric_limits :: max (), il n'y a pas de limite: Lien sur cplusplus.com: std :: istream :: ignore

Si vous voulez sauter beaucoup de lignes, vous devriez certainement les utiliser à la place de getline: lorsque je devais sauter 100 000 lignes dans mon fichier, cela prenait environ une seconde, mais 22 secondes avec getline.

3
Arthur P. Golubev

Appelez getline () une fois pour jeter la première ligne.

Il existe d'autres méthodes, mais le problème est le suivant: vous ne savez pas combien de temps durera la première ligne, n'est-ce pas? Donc, vous ne pouvez pas sauter avant de savoir où se trouve le premier '\ n'. Si toutefois vous saviez combien de temps la première ligne allait durer, vous pouvez simplement chercher au-delà, puis commencer à lire, ce serait plus rapide.

Donc, le faire de la première façon ressemblerait à quelque chose comme:

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

int main () 
{
    // Open your file
    ifstream someStream( "textFile.txt" );

    // Set up a place to store our data read from the file
    string line;

    // Read and throw away the first line simply by doing
    // nothing with it and reading again
    getline( someStream, line );

    // Now begin your useful code
    while( !someStream.eof() ) {
        // This will just over write the first line read
        getline( someStream, line );
        cout << line << endl;
    }

    return 0;
}
2
Adam
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
string textString;
string anotherString;
ifstream textFile;
textFile.open("TextFile.txt");
if (textFile.is_open()) {
    while (getline(textFile, textString)){
        anotherString = anotherString + textString;
    }
}

std::cout << anotherString;

textFile.close();
return 0;
}
0
Aaron Sterling