если файл большой и программа работает в основном с одними и теми же файлами, то можно где-нибудь хранить связку "путь" + "кол-во строк" + "дата последнего изменения", чтоб каждый раз не тратить время на подсчет
>эээ.. лёгких путей не ищем. проще просто построчно читать файл в пустоту, как написал автор. другого вменяемого способа по-моему нет.
Проще в каком плане? Писать меньше? Да. Хотя смотря на чем. Но пошустрее то будет пронестить курсором по файлу без таинственного "чтения в пустоту". Хотя это опять же зависит от языка наврное.
PS. Для руби может быть это и плохое решение, только название его знаю.
>Но пошустрее то будет пронестить курсором по файлу без таинственного "чтения в пустоту".
Шустрее точно не будет. Да и короче ты не напишешь))
while(<FILEDESC>)
{
i++;
};
>Шустрее точно не будет. Да и короче ты не напишешь))
Хм, возможно. Но я не зря писал (и оставлял себе лазейку;) ) про "смотря на чем писать". И топикстартер говорил про "руби и не только". В случае си (а может и си++, stl не знаю) будет шустрее и вероятно короче читать файл.
С другой стороны, если количество строк нужно узнать лишь любопытства ради, то нафик си. А если это практическая задача,.. На практике с такой не сталкивался, поэтому опять нафик сишное решение.
Но все же я предлагал это с мыслью, что решается некая задача на неком низкоуровневом языке, а в этих двух условиях, имхо это оптимально.
Посчитал строки в /usr/src/linux/.config. Посимвольное считывание (fgetc) начисто слило построчному (getline) (под ним видимо выполняется поблочное чтение, как и сказал lester и до чего не додумался я).
>насчет полюбому - это почему?
ну смотри:
1) блочное, если я правильно понял
while(read(file, buf, 4096) > 0)
{
for(i = 0; i < 4096; i++)
{
if(buf[i] == ´\n´)
counter++;
}
}
2) построчное
while(gets(file) != NULL)
counter++;
С точки зрения алгоритма, по моему вопросов нет. второй вариант победил:)
>и вы получаете... [голосом якубовича] АВТОМОБиль :)
И говорю о том, что функция, читающая файл построчно в любом случае у себя внутри ищет этот злополучный символ переноса. Но очевидно, ищет не непосредственно на винте (как я по наивности предполагал чуть раньше), а в заранее приготовленном буфере. Т.е. в итоге мы имеем поблочное чтение с поиском по блоку.
Вот только смысла писать велосипед нету. Короче говоря, благодарю за то, что подтолкнули размышления в верном направлении.
это расширение gcc - потому им пользоваться не стоит, да и тут идет ненужное выделение памяти( которую надо еще и чистить ) + копирование, так что это самый медленный вариант
1. только для ...nix
2. отлично подходит для скриптов, но за такое в С-ом коде надо руки обрывать( тем более, что "ручной" подсчет занимает несколько строк )
и ваш пример таки соберется( благодаря тому, что у вас паскалевская? привычка описывать переменные в начале ), но четыре строки полностью "выпадут" из программы,