Question

Quel est le moyen le plus compact de calculer le nombre de lignes d’un fichier? J'ai besoin de cette information pour créer / initialiser une structure de données matricielle.

Plus tard, je dois parcourir le fichier à nouveau et stocker les informations dans une matrice.

Mise à jour: D'après Dave Gamble. Mais pourquoi cela ne compile pas? Notez que le fichier peut être très volumineux. Alors j'essaie d'éviter d'utiliser des conteneurs pour économiser de la mémoire.

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


int main  ( int arg_count, char *arg_vec[] ) {
    if (arg_count !=2 ) {
        cerr << "expected one argument" << endl;
        return EXIT_FAILURE;      
    }

    string line;
    ifstream myfile (arg_vec[1]);

    FILE *f=fopen(myfile,"rb");
    int c=0,b;
    while ((b=fgetc(f))!=EOF) c+=(b==10)?1:0;
    fseek(f,0,SEEK_SET);


    return 0;
}
Était-ce utile?

La solution

FILE *f=fopen(filename,"rb");

int c=0,b;while ((b=fgetc(f))!=EOF) c+=(b==10)?1:0;fseek(f,0,SEEK_SET);

Répondez en c. Ce genre de compact?

Autres conseils

Je pense que cela pourrait le faire ...

std::ifstream file(f);
int n = std::count(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), '\n') + 1;

Si la raison pour laquelle vous devez & "revenir en arrière &"; c’est parce que vous ne pouvez pas continuer sans la taille, essayez de réorganiser votre configuration.

En d’autres termes, parcourez le fichier et stockez chaque ligne dans un std::vector<string> ou quelque chose du genre. Ensuite, vous avez la taille, avec les lignes dans le fichier:

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

int main(void)
{
    std::fstream file("main.cpp");
    std::vector<std::string> fileData;

    // read in each line
    std::string dummy;
    while (getline(file, dummy))
    {
        fileData.push_back(dummy);
    }

    // and size is available, along with the file
    // being in memory (faster than hard drive)
    size_t fileLines = fileData.size();

    std::cout << "Number of lines: " << fileLines << std::endl;
}

Voici une solution sans le conteneur:

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

int main(void)
{
    std::fstream file("main.cpp");
    size_t fileLines = 0;    

    // read in each line
    std::string dummy;
    while (getline(file, dummy))
    {
        ++fileLines;
    }

    std::cout << "Number of lines: " << fileLines << std::endl;
}

Bien que je doute que ce soit le moyen le plus efficace. L'avantage de cette méthode était la possibilité de stocker les lignes en mémoire au fur et à mesure.

#include <stdlib.h>
int main(void) { system("wc -l plainfile.txt"); }

Comptez le nombre d'instances de '\n'. Cela fonctionne pour les fins de ligne * nix (\ n) et DOS / Windows (\ r \ n), mais pas pour les Mac old-skool (System 9 ou peut-être avant), qui utilisaient seulement \ r. Je n'ai jamais vu un cas se présenter comme une fin de ligne, je ne m'inquiéterais donc pas à moins que vous ne sachiez que ce sera un problème.

Modifier: si votre entrée n’est pas ASCII, vous pouvez également rencontrer des problèmes d’encodage. À quoi ressemble votre contribution?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top