Я работаю над реализацией функции хвоста, и я должен использовать только read()
, write()
и lseek()
для ввода-вывода, и до сих пор у меня есть это:Печать последних 10 строк файла или stdin с чтением и lseek
int printFileLines(int fileDesc)
{
char c;
int lineCount = 0, charCount = 0;
int pos = 0, rState;
while(pos != -1 && lineCount < 10)
{
if((rState = read(fileDesc, &c, 1)) < 0)
{
perror("read:");
}
else if(rState == 0) break;
else
{
if(pos == -1)
{
pos = lseek(fileDesc, 0, SEEK_END);
}
pos--;
pos=lseek(fileDesc, pos, SEEK_SET);
if (c == '\n')
{
lineCount++;
}
charCount++;
}
}
if (lineCount >= 10)
lseek(fileDesc, 2, SEEK_CUR);
else
lseek(fileDesc, 0, SEEK_SET);
char *lines = malloc(charCount - 1 * sizeof(char));
read(fileDesc, lines, charCount);
lines[charCount - 1] = 10;
write(STDOUT_FILENO, lines, charCount);
return 0;
}
до сих пор он работает для файлов, которые имеют более чем 10 строк, но тормоза, когда я передать файл с менее чем 10 строк, он просто печатает последнюю строку этого файла, и я могу» t получить его для работы с stdin
. Если кто-то может дать мне представление о том, как исправить эти проблемы, что было бы здорово: D
Спасибо !!!!!!!! Я боролся с этим часами! На заметку о производительности я бы даже не использовал эти функции, но этот черт возьми человек ... – Reaper9806