Улучшить консольное приложение для чтения - C (СИ)
Формулировка задачи:
Всем здравствуйте.
Товарищи, подскажите:
Я написал на С простенькую читалочку, которая открывает текстовый файл и строку за строкой выводит его прямо в консоль. А при нажатии клавиши Enter сохраняет в другом файле номер последней показанной строки и консоль закрывается. Вот код:
И собственно вопрос:
Как сделать, чтобы при запуске, она начинала чтение файла с той строки, номер которой записан в ?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char s[2000];
int i=0, code;
FILE *fp, *fcl;
fp = fopen ("book.txt", "r"); //Файл из которого читаем книгу.
fcl = fopen ("numstr.txt", "w+"); //Куда сохраняем номер последней
//прочитанной строки.
while (NULL != fgets (s, 2000, fp)) //Цикл, пока не закончится файл
{
printf ("%s", s); //Показываем строку.
i++; //Записываем номер.
code = getch (); //При нажатии
if (code == 13) //клавиши Enter
{ //программа
fprintf (fcl, "%d", i); //записывает в отдельный файл номер
break; //последней показанной строки
} //и выходит из цикла.
getch (); //При нажатии другой клавиши
} //цикл повторяется.
fclose (fp);
system("PAUSE");
return 0;
}"book.txt"
"numstr.txt"
Решение задачи: «Улучшить консольное приложение для чтения»
textual
Листинг программы
int main()
{
Start();
char s[4000];
int i=0, code, n;
FILE *fp, *fnum, *fcl;
//Добавил переменную и указатель
fnum = fopen ("numstr.txt", "r");
fscanf (fnum, "%d", &n);
fclose (fnum);
n--;
fp = fopen ("book.txt", "r");
fcl = fopen ("numstr.txt", "w+");
//И цикл, который вникуда считывает строки до номера, записанного в n
while (i<n)
{
fgets (s, 4000, fp);
i++;
}
while (NULL != fgets (s, 4000, fp))
{
printf ("%s\n", s);
i++;
code = getch ();
if (code == 13)
{
fprintf (fcl, "%d", i);
break;
}
getch ();
}
fclose (fp);
fclose (fcl);
system("PAUSE");
return 0;
}
Объяснение кода листинга программы
int main()- функция main() является точкой входа в программу.Start();- вызывает функцию Start(), которая, вероятно, инициализирует программу.char s[4000];- объявляет массив s для хранения строк.int i=0, code, n;- объявляет переменные i, code и n.FILE *fp, *fnum, *fcl;- объявляет указатели fp, fnum и fcl для работы с файлами.fnum = fopen (numstr.txt,r);- открывает файл numstr.txt для чтения.fscanf (fnum,%d, &n);- считывает из файла numstr.txt число и сохраняет его в переменной n.fclose (fnum);- закрывает файл numstr.txt.n--;- уменьшает значение n на 1.fp = fopen (book.txt,r);- открывает файл book.txt для чтения.fcl = fopen (numstr.txt,w+);- открывает файл numstr.txt для записи и обновления.while (i<n)- начинает цикл, который считывает строки из файла book.txt до тех пор, пока i меньше n.fgets (s, 4000, fp);- считывает строку из файла book.txt в массив s.i++;- увеличивает значение i на 1.while (NULL != fgets (s, 4000, fp))- начинает цикл, который считывает строки из файла book.txt до тех пор, пока не будет считан пустой строки (NULL).printf (%s\n, s);- выводит считанную строку.i++;- увеличивает значение i на 1.code = getch ();- получает код из консоли (вероятно, это номер строки).if (code == 13)- если полученный код равен 13 (ENTER), то переходит к следующему оператору.fprintf (fcl,%d, i);- записывает значение i в файл numstr.txt.break;- прерывает цикл.getch ();- получает код из консоли (вероятно, это номер строки).fclose (fp);- закрывает файл book.txt.fclose (fcl);- закрывает файл numstr.txt.system(PAUSE);- приостанавливает выполнение программы до нажатия клавиши ENTER.return 0;- завершает программу.