Le moyen le plus compact de compter le nombre de lignes dans un fichier en C ++
-
22-07-2019 - |
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;
}
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?