C ++でファイル内の行数をカウントする最もコンパクトな方法
-
22-07-2019 - |
質問
ファイルの行数を計算する最もコンパクトな方法は何ですか? マトリックスデータ構造を作成/初期化するには、この情報が必要です。
後でもう一度ファイルを調べて、マトリックス内に情報を保存する必要があります。
更新: Dave Gambleに基づいています。しかし、なぜこれがコンパイルされないのですか? ファイルは非常に大きくなる可能性があることに注意してください。だから私はコンテナの使用を避けようとします メモリを節約します。
#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;
}
解決
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での回答。 その種のコンパクト?
他のヒント
これでうまくいくと思う...
std::ifstream file(f);
int n = std::count(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), '\n') + 1;
理由が<!> quot;もう一度戻る<!> quot;サイズがないと続行できないため、セットアップの順序を変更してみてください。
つまり、ファイル全体を読み、各行を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;
}
これが最も効率的な方法だとは思いませんが。この方法の利点は、行をメモリに保存できることです。
#include <stdlib.h>
int main(void) { system("wc -l plainfile.txt"); }
'\n'
のインスタンスの数をカウントします。これは、* nix(\ n)およびDOS / Windows(\ r \ n)の行末では機能しますが、\ rのみを使用した旧式のMac(System 9またはそれ以前)では機能しません。行末として\ rだけが出てくるケースを見たことがないので、それが問題になるとわかっていなければ心配しません。
編集:入力がASCIIでない場合、エンコードの問題も発生する可能性があります。入力はどのように見えますか?
所属していません StackOverflow