по 4096 символов читать тоже не сахар. надо попробовать выпросить у системы буфер побольше (начинать, скажем, с 64к и по убывающей), а потом читать в него
2 Жека jkff Кирпичев
Я же сказал – алгоритм лобовой.Понятно, что для общего случая с неизвестной заранее максимальной длинной строк не подходит и нужно, как ты предложил, делать буферное считывание.
Но автор темы просто задал вопрос, как это можно сделать, а не просил мегауниверсальный и оптимизированный алгоритм
Эта прога сдохнет на строчке более 1024 символов.
Надо читать по 4096 байт (например) в буфер, и при каждом чтении смотреть, сколько в буфере "\n"ов. Накопилось достаточно – вот и славно. И никаких нахрен fscanf'ов, это будет медленно и небезопасно.
неа, scanf возвращает количество переменных, которым были присвоены значения, а не признак конца файла а вот eof и feof как раз проверяют на конец файла
\n – новая строка
\r – возврат каретки
В Windows в текстовых файлах для обозначения новой строки используются эти два символа. Правда, если не ошибаюсь, библиотека C для работы с файлами, преобразует последовательно идущие "\r\n" в "\n"
Вообще, это можно сделать примерно так
int i;
int n = 5; //с какой строки читаем, нумерация строк с единицы
FILE f;
char str[1024]; //буфер, куда считывается строка
f = fopen("file.txt", "rt");
i = 0;
while(i<n)
{
fscanf(f, "%s\n", str);
}
//теперь в str находится нужная строка файла (пятая в данном случае)
если скрипт совсем табуреточного уровня то:
береш целое рандомное число, через цикл отсчитываешь нужную строчку (если поддерж процедуру поиска по строке то все еше проще)
на каком языке то?
11 декабря 2007 в 23:04
Спасибо всем!! Всё заработало!
11 декабря 2007 в 11:05
Ну тогда уж лучше просто замэпить файл в память, и пусть ОС сама разбирается, какой там буфер.
А лучше всего – посмотреть в codesearch.google.com исходники какого-нибудь tail или less
11 декабря 2007 в 11:00
по 4096 символов читать тоже не сахар. надо попробовать выпросить у системы буфер побольше (начинать, скажем, с 64к и по убывающей), а потом читать в него
11 декабря 2007 в 11:00
2 Жека jkff Кирпичев
Я же сказал – алгоритм лобовой.Понятно, что для общего случая с неизвестной заранее максимальной длинной строк не подходит и нужно, как ты предложил, делать буферное считывание.
Но автор темы просто задал вопрос, как это можно сделать, а не просил мегауниверсальный и оптимизированный алгоритм
11 декабря 2007 в 10:03
Эта прога сдохнет на строчке более 1024 символов.
Надо читать по 4096 байт (например) в буфер, и при каждом чтении смотреть, сколько в буфере "\n"ов. Накопилось достаточно – вот и славно. И никаких нахрен fscanf'ов, это будет медленно и небезопасно.
10 декабря 2007 в 23:04
неа, scanf возвращает количество переменных, которым были присвоены значения, а не признак конца файла а вот eof и feof как раз проверяют на конец файла
10 декабря 2007 в 23:02
xVir, !eof(f) пахать не будет! надо юзать
scanf(…) != EOF
10 декабря 2007 в 20:00
Ну дак поставь просто проверку на окончание файла.
while(i<n && !eof(f))
{
fscanf(f, "%s\n", str);
}
тока в таком случае если строк меньше чем надо, то возвратится последняя
10 декабря 2007 в 16:02
ну я же предупредил ))) к тому же, насколько помню, если читать за концом файла, то прога рухнет и выйдет из цикла
10 декабря 2007 в 16:01
Ага, не застрахован, это точно, например от бесконечного цикла =)
10 декабря 2007 в 7:05
\n – новая строка
\r – возврат каретки
В Windows в текстовых файлах для обозначения новой строки используются эти два символа. Правда, если не ошибаюсь, библиотека C для работы с файлами, преобразует последовательно идущие "\r\n" в "\n"
Вообще, это можно сделать примерно так
int i;
int n = 5; //с какой строки читаем, нумерация строк с единицы
FILE f;
char str[1024]; //буфер, куда считывается строка
f = fopen("file.txt", "rt");
i = 0;
while(i<n)
{
fscanf(f, "%s\n", str);
}
//теперь в str находится нужная строка файла (пятая в данном случае)
Алгоритм лобовой, не застрахован от ошибок.
10 декабря 2007 в 7:04
\r возврат каретки. это для win так надо делать.
10 декабря 2007 в 0:01
эээ.. где \n – перевод строки, а \r – ???
9 декабря 2007 в 23:04
scanf("\r\n"), наверно=)
9 декабря 2007 в 23:01
на C
а вот как отсчитать строку не могу понять!
9 декабря 2007 в 22:04
если скрипт совсем табуреточного уровня то:
береш целое рандомное число, через цикл отсчитываешь нужную строчку (если поддерж процедуру поиска по строке то все еше проще)
на каком языке то?