معظم المدمجة طريقة لحساب عدد الأسطر في ملف في C++

StackOverflow https://stackoverflow.com/questions/1225589

  •  22-07-2019
  •  | 
  •  

سؤال

ما هو الأكثر إحكاما طريقة لحساب عدد الخطوط من ملف ؟ أحتاج هذه المعلومات لإنشاء/تهيئة مصفوفة بنية البيانات.

في وقت لاحق يجب أن تذهب من خلال الملف مرة أخرى و تخزين المعلومات داخل المصفوفة.

تحديث: على أساس ديف مقامرة.ولكن لماذا لا تجمع?علما أن هذا الملف يمكن أن تكون كبيرة جدا.لذا حاول تجنب استخدام الحاويات إلى حفظ الذاكرة.

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

الجواب في ج.هذا النوع من مضغوط ؟

نصائح أخرى

أعتقد أن هذا قد تفعل ذلك...

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

إذا كان السبب تحتاج إلى "العودة مرة أخرى" لأنك لا يمكن أن تستمر دون حجم محاولة إعادة ترتيب الإعداد الخاص بك.

هذا هو, من خلال قراءة ملف تخزين كل سطر في 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 ( ) و DOS/Windows ( ) خط النهايات ، ولكن ليس من أجل القديمة-المدرسة ماك (نظام 9 أو ربما قبل ذلك) ، والتي تستخدم فقط .أنا لم أر قط الحالة تأتي مع كما خط النهايات, لذلك لا تقلق بشأن ذلك إلا إذا كنت تعرف انها ستكون قضية.

تحرير:إذا كان رأيك غير ASCII, ثم هل يمكن تشغيل في مشاكل الترميز كذلك.ما هي المدخلات الخاصة بك تبدو وكأنها ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top