Pregunta

¿Cuál es la forma más compacta de calcular el número de líneas de un archivo? Necesito esta información para crear / inicializar una estructura de datos matriciales.

Más tarde tengo que revisar el archivo nuevamente y almacenar la información dentro de una matriz.

Actualización: basado en Dave Gamble's. ¿Pero por qué esto no se compila? Tenga en cuenta que el archivo podría ser muy grande. Entonces trato de evitar usar el contenedor para ahorrar 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;
}
¿Fue útil?

Solución

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

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

Respuesta en c. ¿Ese tipo de compacto?

Otros consejos

Creo que esto podría hacerlo ...

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

Si la razón por la que necesita " regrese de nuevo " es porque no puede continuar sin el tamaño, intente volver a ordenar su configuración.

Es decir, lea el archivo, almacenando cada línea en un std::vector<string> o algo así. Luego tiene el tamaño, junto con las líneas en el archivo:

#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;
}

Aquí hay una solución sin el contenedor:

#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;
}

Aunque dudo que sea la forma más eficiente. El beneficio de este método fue la capacidad de almacenar las líneas en la memoria a medida que avanzaba.

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

Cuente el número de instancias de '\n'. Esto funciona para las terminaciones de línea * nix (\ n) y DOS / Windows (\ r \ n), pero no para Mac antiguo (Sistema 9 o tal vez antes), que usaba solo \ r. Nunca he visto un caso con solo \ r como terminaciones de línea, por lo que no me preocuparía a menos que sepa que será un problema.

Editar: si su entrada no es ASCII, entonces también podría encontrarse con problemas de codificación. ¿Cómo se ve tu entrada?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top