2009-08-04 9 views
3

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

後でもう一度ファイルを調べて、情報を行列内に格納する必要があります。

更新: Dave Gamble'sに基づく。しかし、なぜこれはコンパイルされませんか? ファイルが非常に大きい可能性があることに注意してください。だから私はコンテナ を使用してメモリを節約することを避けようとしています。

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

それはコンパイルできない理由を教えてください。コンパイルエラーを投稿してください。 – GManNickG

+1

しかし、あなたが '#include ' – GManNickG

+2

FILE * f = fopen(arg_vec [1]、 "rb");が必要であると推測します。お願いします。 –

答えて

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); 

Answer c。 そのようなコンパクトなの?

+0

Ew。 [Blah blah 15 characters] – GManNickG

+2

私は?1:0に残っていることに感謝します。それはうまく動作しません。 )fooek(f、0、SEEK_SET) ' –

+4

' int c = 0; while(!fscanf(f、 "%* * ^% 。私はそのようなfscanfを使用することの卓越性に屈する。 –

1

'\n'のインスタンス数を数えます。これは、* nix(\ n)とDOS/Windows(\ r \ n)の行末では機能しますが、\ rだけを使用していたold-skool Mac(System 9またはそれ以前)では機能しません。私は決して行末として\ rだけ出てくるのを見たことがないので、それが問題になることが分かっていない限り、私はそれについて心配しません。

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

+0

それはクロスプラットフォームではないかもしれない(私はちょうど言っている)。 – Kredns

+0

@ 280Z28:どうすればいいですか? – neversaint

10

「元に戻す」必要がある理由は、サイズを指定しないと続行できないためです。セットアップの順序を変更してみてください。

つまり、ファイルを読み取って、各行をstd::vector<string>などで保存します。私はそれが最も効率的な方法だ疑うけれども

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

:ここ

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

コンテナのないソリューションです。そして、あなたは、ファイル内の行と一緒にサイズは、持っています。この方法の利点は、あなたが行ったときにラインをメモリに保存できることでした。私は、これはそれを行うかもしれないと思う

+0

これは私が提案しようとしている方法ですが、実際に投稿する前にすべてをテストしなければならないことがC++を使用してから十分に長くなっています。私に時間を節約してくれてありがとう+1:D –

+3

本当に誰かが実際にコードをテストしたことを伝えると、ソースファイルの名前が入力されているということが分かります。D:D –

+0

lol、そうです。私はそれを持っていた 'ビンゴ!私が思った瞬間、 "私は....ああ、テストするファイルが必要です" – GManNickG

10

...

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

+1はstreambufsの使い方を知っています。 – quark

3
#include <stdlib.h> 
int main(void) { system("wc -l plainfile.txt"); } 
関連する問題