2009-08-04 64 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 2009-08-04 03:36:38

+1

雖然猜測是你需要`#include ` – GManNickG 2009-08-04 03:37:17

+2

FILE * f = fopen(arg_vec [1],「rb」);請。 – 2009-08-04 03:38:00

回答

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。 那種緊湊?

1

統計'\n'的實例數。這適用於* nix(\ n)和DOS/Windows(\ r \ n)行結尾,但不適用於舊版skool Mac(系統9或可能在此之前),它僅用於\ r。我從來沒有見過一個案例只是作爲行結尾,所以我不會擔心它,除非你知道這將是一個問題。

編輯:如果你的輸入不是ASCII,那麼你也可能遇到編碼問題。你的輸入是什麼樣子?

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

雖然我懷疑這是最有效的方式。這種方法的好處是可以隨時隨地將行存儲在內存中。

10

我認爲這可能做...

std::ifstream file(f); 
int n = std::count(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), '\n') + 1; 
3
#include <stdlib.h> 
int main(void) { system("wc -l plainfile.txt"); } 
相關問題