Il modo più compatto per contare il numero di righe in un file in C ++
-
22-07-2019 - |
Domanda
Qual è il modo più compatto per calcolare il numero di righe di un file? Ho bisogno di queste informazioni per creare / inizializzare una struttura di dati a matrice.
Successivamente devo rivedere il file e memorizzare le informazioni in una matrice.
Aggiornamento: basato su Dave Gamble's. Ma perché questo non si compila? Si noti che il file potrebbe essere molto grande. Quindi cerco di evitare l'uso del contenitore per risparmiare memoria.
#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;
}
Soluzione
FILE *f=fopen(filename,"rb");
int c=0,b;while ((b=fgetc(f))!=EOF) c+=(b==10)?1:0;fseek(f,0,SEEK_SET);
Risposta in c. Quel tipo di compatto?
Altri suggerimenti
Penso che questo potrebbe farlo ...
std::ifstream file(f);
int n = std::count(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), '\n') + 1;
Se il motivo è necessario " tornare indietro " è perché non puoi continuare senza le dimensioni, prova a riordinare la tua configurazione.
Cioè, leggi il file, memorizzando ogni riga in std::vector<string>
o qualcosa del genere. Quindi hai le dimensioni, insieme alle linee nel file:
#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;
}
Ecco una soluzione senza contenitore:
#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;
}
Anche se dubito che sia il modo più efficiente. Il vantaggio di questo metodo è stato la capacità di memorizzare le linee in memoria mentre si andava.
#include <stdlib.h>
int main(void) { system("wc -l plainfile.txt"); }
Conta il numero di istanze di '\n'
. Funziona con le terminazioni di linea * nix (\ n) e DOS / Windows (\ r \ n), ma non per Mac vecchio sistema (System 9 o forse precedente), che utilizzava solo \ r. Non ho mai visto un caso inventare solo come terminazioni di riga, quindi non mi preoccuperei a meno che tu non sappia che sarà un problema.
Modifica: se il tuo input non è ASCII, potresti incorrere anche in problemi di codifica. Com'è il tuo input?