Frage

Was ist der kompakteste Weg, um die Anzahl der Zeilen einer Datei zu berechnen? Ich brauche diese Informationen zu erstellen / eine Matrix-Datenstruktur initialisieren.

Später muß ich wieder durch die Datei gehen und die Informationen in einer Matrix gespeichert werden.

Update: Auf der Grundlage von Dave Gamble. Aber warum diese nicht kompiliert? Beachten Sie, dass die Datei sehr groß sein könnte. Also versuche ich zu vermeiden Behälter mit um Speicherplatz zu sparen.

#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;
}
War es hilfreich?

Lösung

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

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

Antwort in c. Diese Art von Kompakt?

Andere Tipps

Ich denke, das es tun könnte ...

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

Wenn der Grund müssen Sie „wieder dort hin gehen“, weil man nicht ohne die Größe fortsetzen kann, versuchen Umordnung der Konfiguration aus.

Das heißt, durch die Datei zu lesen, jede Zeile in einem std::vector<string> oder etwas zu speichern. Dann können Sie die Größe haben, zusammen mit den Zeilen in der Datei:

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

Hier ist eine Lösung ohne den Behälter:

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

Obwohl ich bezweifle, das ist der effizienteste Weg. Der Vorteil dieser Methode war die Fähigkeit, die Linien im Speicher zu speichern, wie Sie geht.

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

Die Anzahl der Instanzen von '\n'. Dies funktioniert für * nichts (\ n) und DOS / Windows (\ r \ n) Zeilenende, aber nicht für Old School Mac (System 9 oder vielleicht davor), die nur \ r verwendet. Ich habe noch nie einen Fall kam mit nur \ r als Zeilenende gesehen, also würde ich mir keine Sorgen, wenn Sie wissen, dass es ein Problem sein.

Edit: Wenn Sie Ihre Eingabe nicht ASCII ist, dann könnte man in Codierung Probleme läuft auch. Was ist Ihre Eingabe aussehen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top