3

ファイルの行数を計算する最もコンパクトな方法は何ですか?マトリックスデータ構造を作成/初期化するには、この情報が必要です。

後で、ファイルをもう一度調べて、情報をマトリックス内に保存する必要があります。

更新: DaveGambleに基づいています。しかし、なぜこれがコンパイルされないのですか?ファイルが非常に大きくなる可能性があることに注意してください。だから私はメモリを節約するためにコンテナを使わないようにしています。

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

5 に答える 5

10

「もう一度戻る」必要がある理由がサイズなしでは続行できないためである場合は、セットアップを並べ替えてみてください。

つまり、ファイルを読み、各行をstd::vector<string>何かに保存します。次に、ファイル内の行とともにサイズを取得します。

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

コンテナなしのソリューションは次のとおりです。

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

それが最も効率的な方法だとは思いませんが。この方法の利点は、行をメモリに保存できることです。

于 2009-08-04T03:25:48.550 に答える
10

私はこれがそれをするかもしれないと思います...

std::ifstream file(f);
int n = std::count(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), '\n') + 1;
于 2009-08-04T03:29:50.493 に答える
6
FILE *f=fopen(filename,"rb");

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

cで答えてください。そんなコンパクト?

于 2009-08-04T03:21:14.440 に答える
3
#include <stdlib.h>
int main(void) { system("wc -l plainfile.txt"); }
于 2009-08-04T05:30:54.610 に答える
1

のインスタンスの数を数えます'\n'。これは、* nix(\ n)およびDOS / Windows(\ r \ n)の行末で機能しますが、\ rだけを使用していた旧式のMac(System 9またはそれ以前)では機能しません。行末として\rだけが出てくるケースを見たことがないので、問題になることがわかっていない限り、心配する必要はありません。

編集:入力がASCIIでない場合は、エンコーディングの問題も発生する可能性があります。あなたの入力はどのように見えますか?

于 2009-08-04T03:19:42.540 に答える