Количество строк в файле

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by marcos, 25 Jan 2010.

Thread Status:
Not open for further replies.
  1. marcos

    marcos New Member

    Joined:
    8 Nov 2009
    Messages:
    111
    Likes Received:
    1
    Reputations:
    -5
    Всем привет!
    Подскажите как решить такую проблему:

    Я объявил переменную типа file;
    Подскажите как подсчитать количество строк в файле?
     
  2. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    а какой тип файла?
     
  3. marcos

    marcos New Member

    Joined:
    8 Nov 2009
    Messages:
    111
    Likes Received:
    1
    Reputations:
    -5
    Файл простой текстовой...
    Точнее я хочу чтобы файл был с расширением другим, но редактировать его можно было как текстовой
     
  4. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    а если так?

    Code:
    
    var Strings: TStringList;
    
    ...
    
    Strings := TStringList.Create;
    Strings.LoadFromFile('c:\vdebug.txt');
    ShowMessage(IntToStr(Strings.Count));
    
    
     
  5. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    Ну если файл текстовый то лучше f: text;

    Если таким образом то кол-во строк посчитывается мега-тривиально
     
  6. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Если на Delphi, то RedFern.89

    если на pascal то flacs
     
  7. energ77

    energ77 New Member

    Joined:
    17 Jul 2010
    Messages:
    49
    Likes Received:
    4
    Reputations:
    0
    Подсчет на PHP

    Если php то:


    PHP:
    <? $filefile('имя_файла.тхт'); echo count($file?>
    не забывай правильно указать путь до файла :)
     
  8. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    какой нахрен пхп?
    вы что, мозгами двинулись?
    название раздела смотрите.
     
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 energ77 а теперь посчитай таким образом кол-во строк в файле весом 3 гига. слабо?
    если Си
    то
    Code:
    FILE* f;
    int cnt;
    char buf[256];
    f = fopen("filename", "rt");
    if (f)
    {
      while (!feof(f)) 
          if (fgets(buf, 256, f)) cnt++;
    
      fclose(f);
    }
    
    
     
  10. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    slesh
    Эм, а зачем считывать строки?

    Вот моя вариация на C#:
    Code:
    using System;
    using System.IO;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int numLines = 0;
    
                using (FileStream fStream = new FileStream(@"D:\1.txt", FileMode.Open))
                {
                    // Если файл непустой.
                    if (fStream.Length != 0)
                    {
                        int b;
                        numLines = 1;
    
                        while ((b = fStream.ReadByte()) != -1)
                        {
                            // Если считан символ '\n'.
                            if (b == 10)
                            {
                                ++numLines;
                            }
                        }
                    }
                }
    
                Console.WriteLine(numLines);
                Console.ReadKey();
            }
        }
    }
     
  11. fd00ch

    fd00ch Member

    Joined:
    5 Oct 2010
    Messages:
    18
    Likes Received:
    31
    Reputations:
    9
    действительно, куда лучше побайтно считать файл :D кстати, твой код просрётся на маковских файлах

    строго говоря, для небольших файлов только TStringList осилит задачу при любом формате файла, а для гигабайтных файлов решения ещё никто не привёл))
     
  12. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 X-rus дело в тому, что по сути это одно и тоже, вот только в случае со строчками сишный CRT/LIBC буферизует данные в памяти, что намного ускоряет работу

    2 fd00ch я привел. спокойно будет работать и на 100 гиговых файлах. главное тип переменно cnt поставить int64. А про мак формат - он и нах никому не нужен потому что редкий очень под винду. а в маке, там gets умеет читать его
     
    #12 slesh, 31 Aug 2011
    Last edited: 31 Aug 2011
  13. fd00ch

    fd00ch Member

    Joined:
    5 Oct 2010
    Messages:
    18
    Likes Received:
    31
    Reputations:
    9
    slesh
    1. если я правильно понял - твой код не осилит файл, в которои строки занимают больше 256 символов)
    2. скорее всего он также просрется если переносы отличны от CRLF
    3. если плюнуть на перевод строки, то код проверки файла любого размера привели выше, с использованием textfile))
    4. textfile в delphi тоже работает с буферизацией, никто там отдельные строки из файла не считывает, хапают блоками
    5. ну и общий "фи" ко всем решениям - 99% что они все просрутся с юникодными файлами, где в переносах строк черт ногу сломит))
     
  14. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 fd00ch
    1) осилит, потому что если строка будет больше, то она обрежется. но непосредственно сама строка будут всё же прочитана, только в буфер не помещена целеком
    2) да будет тебе известно что перенос строк для fget идет по стандарту Posix/C90/C99 то есть символ \n а то, что MacOS нарушая стандарты сделало перенос \r то это её проблемы
    3) я привел на Си а не на Делфи
    4) ну да буферизация есть везде почти
    5) да будет тебе известно, юникод - это принцип кодирования текста, и он не затрагивает символы переноса строки. и это дело зависит от программы кодировщика.
    по этому символы \r\n записываются также, только для каждого будет двухбайтовая кодировка. хотя некоторые программы всё равно оставят однобайтовую.

    Если дело на то пошло, то тут нет вообще ни единого правильного метода, потому что самый правильный метод это файлмаппиг в память блоками кратными размеру страницы и размеру кластера, и далее посимвольная проверка. Но кому блять она нужна такая оптимизация если люди юзают тут делфи!!!!
     
    #14 slesh, 1 Sep 2011
    Last edited: 1 Sep 2011
  15. fd00ch

    fd00ch Member

    Joined:
    5 Oct 2010
    Messages:
    18
    Likes Received:
    31
    Reputations:
    9
    slesh
    1. возможно, в С не силен. но не удивлюсь, если такая тупость там возможна - прочитал всю строку, а возвратил часть) как искать остаток и его длину - х.з...
    2. юзеру похер на всю эту порнографию - ему нужно узнать число строк и если прога на этой "простой" операции просирается - то и прога, и её создатель получают соответствующую оценку...
    5. ты паришь, ещё как зависит. хотя бы то, что вместо CR LF получается CR 00 LF 00. есть и другие отличия, подробности - в вики в статье Перенос строки
     
  16. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    fd00ch, не ну холивар, раз уж всякие маки и прочую хрень предлагаешь, если действительно тут про Delphi спрашивают, если бы я писал, то искал бы LF в строке, а на CR не обращал внимания.

    Во во.
     
  17. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 fd00ch
    1) нет это в делфи тупость. тут строго задано что считать не более 255 символов. можно поставить вообще 1 и тогда будет еще более оптимальнее решение, а то что делфи будет выделять памяти для строки и потом помещать в неё всё строку (хотя это даже и не надо) - это весьма плохо. и будет сказываться на производительности.

    2) да похеру, как и что написано, но если человек не знает как делать элементарное, то эта часть особой роли не играет. Да и не было указано что и как должно работать.

    5) ну давай раз на то пошло то почитай всё туже википедию где будет сказано
    CR (ASCII 0x0D) используется в 8-битовых машинах Commodore, машинах TRS-80, Apple II, системах Mac OS до версии 9 и OS-9;
    При этом последняя версия девятой линейки это 9.2.2 которая была выпущена - 6 декабря 2001 так что это уже не актуально.

    Хотя тут дело всё зависит и от файла который ты загружаешь, т.к. в Си есть функции и для работы с юникод файлами.
     
Thread Status:
Not open for further replies.