Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2014, 23:54   #1
Angel_In_Night_Sky
 
Регистрация: 22.04.2014
Сообщений: 8
Сообщение Постраничный вывод файла на Си

Есть программа, которая выводит список команд из файла, но их очень много и на экран всё не помещается, прокруткой все тоже не посмотреть.
Код:
#include <stdio.h>
#include <string.h>

printFile (char fileName[20], char param[3]) { 
// fileName - имя файла 
// param - параметры открытия файла
	// r-чтение
	// w-запись
	// rw-чтение и запись
FILE *file; 
char *fname = fileName;
char result_sting[60]; //Строка в 60 символов

	file = fopen(fname, param);
 
	if(file == 0)
	{
		printf("Не удалось открыть файл '%s'",fname);
		return 0;
	}

	 
	while(fgets(result_sting,sizeof(result_sting),file))
	{
//проверяем является ли последний элемент в строке символом её окончания		
		if(result_sting[strlen(result_sting)-1] == '\n')
		{

// эта часть кода добавлена для отображения символа конца строки в консоль без перевода на новую строку
		  result_sting[strlen(result_sting)-1]='\0';
		}; 
	
		printf("%s\n",result_sting); // печать строки
	}
 
	fclose(file);
 
return 0;

}
В идеале должно быть так:
9_1.jpg

Т.е. сначала выводится то что помещается на страницу, при нажатии Enter +1 строка, N - след. страница и т.д.

Если кто сталкивался, подскажите как написать такое меню на Си
Angel_In_Night_Sky вне форума Ответить с цитированием
Старый 23.04.2014, 01:27   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Если "не париться" над выводом самого меню, то можно примерно так.
Код:
int count = 0, c;//в начале функции где-нибудь
...
if (count >= 0 && count < 24)
    ++count;
else if (count == 24)
{
    int fl = 1;
    while (fl)
    {
        fl = 0;
        c = getch();
        switch (c)
        {
        case 'n':
        case 'N':
            count = 1;
            break;
        case 'a':
        case 'A':
            count = -1;
            break;
        case 13:
            break;
        case 'q':
        case 'Q':
            return 0;
        default:
            fl = 1;
        }
    }
}
printf("%s\n", result_sting);
Такая конструкция выведет первые 24 строки, при нажатии n или N будет печататься 24 строки, при нажатии Enter - 1 строка, при нажатии a или A - все строки, при нажатии q или Q - выход.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 23.04.2014, 10:39   #3
Angel_In_Night_Sky
 
Регистрация: 22.04.2014
Сообщений: 8
По умолчанию

Спасибо! Всё работает, правда Enter выводит просто пустую строку.
Я так понимаю, для того чтобы меню выводить нужно каким-то образом подключать Ncurses?
Angel_In_Night_Sky вне форума Ответить с цитированием
Старый 24.04.2014, 00:27   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Code::Blocks - всё работает.
Код:
#include <stdio.h>
#include <conio.h>
#include <windows.h>

HANDLE hConsole;
WORD saved_attributes, reversed_attributes;

void
spec_print(const char *s)
{
    SetConsoleTextAttribute(hConsole, reversed_attributes);
    printf("%s", s);
    SetConsoleTextAttribute(hConsole, saved_attributes);
}

int
main(void)
{
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
    GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
    saved_attributes = consoleInfo.wAttributes;
    reversed_attributes = ((saved_attributes & 0x0F) << 4) + ((saved_attributes & 0xF0) >> 4);

    int count = 0, c, i = 1;
    while (1)
    {
        if (count >= 0 && count < 24)
            ++count;
        else if (count == 24)
        {
            spec_print("q");
            printf(" Quit ");
            spec_print("SPACE");
            printf(" ");
            spec_print("n");
            printf(" Next Page ");
            spec_print("ENTER");
            printf(" Next Entry ");
            spec_print("a");
            printf(" All");

            int fl = 1;
            while (fl)
            {
                fl = 0;
                c = getch();
                switch (c)
                {
                case ' ':
                case 'n':
                case 'N':
                    count = 1;
                    break;
                case 'a':
                case 'A':
                    count = -1;
                    break;
                case 13:
                    break;
                case 'q':
                case 'Q':
                    return 0;
                default:
                    fl= 1;
                }
            }
            printf("\r                                               ");
        }
        printf("\r%d\n", i++);
    }
    return 0;
}
Изображения
Тип файла: jpg пример.jpg (15.4 Кб, 128 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.04.2014, 22:24   #5
Angel_In_Night_Sky
 
Регистрация: 22.04.2014
Сообщений: 8
По умолчанию

проблема в том, что в линуксе нет файлов conio.h и windows.h...
Angel_In_Night_Sky вне форума Ответить с цитированием
Старый 30.04.2014, 00:48   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Про линукс нужно сразу уточнять
Код:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch( )
{
    struct termios oldt, newt;
    int ch;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    ch = getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    return ch;
}

int
main(void)
{
    int count = 0, c, i = 1;
    while (1)
    {
        if (count >= 0 && count < 24)
            ++count;
        else if (count == 24)
        {
            printf("\e[7mq\e[0m Quit \e[7mSPACE\e[0m \e[7mn\e[0m Next Page \e[7mENTER\e[0m Next Entry \e[7ma\e[0m All");

            int fl = 1;
            while (fl)
            {
                fl = 0;
                c = mygetch();
                switch (c)
                {
                case ' ':
                case 'n':
                case 'N':
                    count = 1;
                    break;
                case 'a':
                case 'A':
                    count = -1;
                    break;
                case '\n':
                    break;
                case 'q':
                case 'Q':
                    return 0;
                default:
                    fl= 1;
                }
            }
            printf("\x1b[1K");
        }
        printf("\r%d\n", i++);
    }
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.05.2014, 00:05   #7
Angel_In_Night_Sky
 
Регистрация: 22.04.2014
Сообщений: 8
По умолчанию

Спасибо, всё получилось!
Вот версия для работы с файлом, может кому полезно будет

Код:
 
  //.............................................................//
 //   Печать файла на экран с выводом меню  //
//............................................................//


#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>

int mygetch( )
{
    struct termios oldt, newt;
    int ch;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    ch = getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    return ch;
}

printFile (char fileName[20], char param[3]) { 
// fileName - имя файла 
// param - параметры открытия файла
	// r-чтение
	// w-запись
	// rw-чтение и запись

FILE *file; 
char *fname = fileName;
char result_sting[120]; //Строка в 120 символов

int count = 0, c;

	file = fopen(fname, param);
 
	if(file == 0)
	{
		printf("Не удалось открыть файл '%s'",fname);
		return 0;
	}

	 
	while(fgets(result_sting,sizeof(result_sting),file)) // до конца файла
	{

	// вывод + меню
	if (count >= 0 && count < 24)
            ++count;
        else if (count == 24)
        {
            printf("\e[7mCTRL+C\e[0m \e[7mESC\e[0m \e[7mq\e[0m Quit \e[7mSPACE\e[0m \e[7mn\e[0m Next Page \e[7mENTER\e[0m Next Entry \e[7ma\e[0m All"); // печатать меню внизу экрана

            int fl = 1;
            while (fl)
            {
                fl = 0;
                c = mygetch();
                switch (c)
                {
                case ' ':
                case 'n':
                case 'N':
                    count = 1;
                    break;
                case 'a':
                case 'A':
                    count = -1;
                    break;
                case '\n':
                    break;
		case 27:
                case 'q':
                case 'Q':
		    printf("\n");
                    return 0;
                default:
                    fl= 1;
                }
            }
          printf("\x1b[1K");
        }
  
//проверяем является ли последний элемент в строке символом её окончания		
	if(result_sting[strlen(result_sting)-1] == '\n')
	{

// отображение символа конца строки в консоль без перевода на новую строку
	result_sting[strlen(result_sting)-1]='\0';
	}; 
	printf("\r%s\n",result_sting); // печать строки
	}
 
fclose(file); 
return 0;

}


main ()
{
 
printFile("putty.txt","r");
	
}
Angel_In_Night_Sky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПОСТРАНИЧНЫЙ ВЫВОД БД в Паскаль Юп@тошк@ Помощь студентам 1 01.06.2011 14:05
Постраничный вывод на файлах Bridun PHP 0 31.01.2011 22:53
Постраничный вывод из БД на PHP mjc66 PHP 11 03.08.2009 11:31
Постраничный вывод Ksy Общие вопросы C/C++ 8 07.06.2009 20:05
Постраничный вывод Naposaram PHP 2 11.02.2009 01:32