Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
1 / 1 / 1
Регистрация: 17.10.2013
Сообщений: 41
1

Реализация UNIX команды "cat" в консоли Windows с использованием WinAPI

13.10.2016, 18:28. Показов 5281. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В консоли Linux есть команда "cat", аналог которой надо сделать под консоль Windows на языке C++. Требуется реализация посредством WinAPI. Если так подумать, то нужно открытие текстового файла организовать и вывод его содержимого в консольку (в случае указания двух файлов мы выводим их подряд). В сети я не нашел код команды "cat" на WinAPI, но без нее вроде как есть:

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>
 
/* 
 * ./cat - объединяет файлы и выводит их на стандартный вывод
 * Использование
 * ./cat [OPTION]... [FILE]...
 *
 * Доступные опции:
 * -A, --show-all
 *          эквивалентно -ET
 * -b, --number-nonblank
 *          нумерует непустые строки
 * -E, --show-ends
 *          выводить символ $ в конце каждой строки
 * -n, --number
 *          нумерует все строки
 * -s, --squeeze-blank
 *          подавляет повторяющиеся пустые строки
 * -T, --show-tabs
 *          выводит символы TAB как ^I
 *     --help
 *          выводит справку
 *     --version
 *          выводит информацию о версии программы
 */
 
// Глобальные флаги
enum global_flags_enum
{
    show_all,
    number_nonblank,
    show_ends,
    number,
    squeeze_blank,
    show_tabs,
    all
};
 
// Обнуляем глобальные флаги
int global_flags[all] = { 0 };
 
void print_file(const char*);
void format_line(const char*, char*);
void setup_flags(enum global_flags_enum);
 
void print_help(int);
 
int main(int argc, char* argv[])
{
    while(1)
    {
        int c;
        int index = 0;
        static struct option options[] =
        {
            {"show-all",        0, NULL, 'A'},
            {"number-nonblank", 0, NULL, 'b'},
            {"show-ends",       0, NULL, 'E'},
            {"number",          0, NULL, 'n'},
            {"squeeze-blank",   0, NULL, 's'},
            {"show-tabs",       0, NULL, 'T'},
            {"help",            0, NULL, 'h'},
            {NULL,              0, NULL,  0 },
        };
        
        c = getopt_long(argc, argv, "AbEnsT", options, &index);
        
        if(c == -1)
            break;
        
        switch(c)
        {       
        case 'h':
            print_help(0);
            
        case 'A':
            setup_flags(show_ends);
            setup_flags(show_tabs);
            break;
            
        case 'b':
            setup_flags(number_nonblank);
            break;
        
        case 'E':
            setup_flags(show_ends);
            break;
        
        case 'n':
            setup_flags(number);
            break;
            
        case 's':
            setup_flags(squeeze_blank);
            break;
            
        case 'T':
            setup_flags(show_tabs);
            break;
            
        case '?':   
            print_help(1);
        }
    }
    
    if(optind == argc)
        print_file("-");
    
    while(optind < argc)
        print_file(argv[optind++]);
 
    exit(0);
}
 
void print_file(const char* file)
{
    FILE* f;
    static char buf[BUFSIZ];
    static char formatted_buf[BUFSIZ];
    if(strcmp(file, "-") == 0)
        f = stdin;
    else if((f = fopen(file, "r")) == NULL)
    {
        perror(file);
        return;
    }
    
    while(fgets(buf, BUFSIZ, f))
    {
        format_line(buf, formatted_buf);
        if(fputs(formatted_buf, stdout) == EOF)
        {
            perror("cat");
            break;
        }
        *formatted_buf = '\0';
    }
        
    if(ferror(f))
        perror(file);
        
    if(f != stdin)
        fclose(f);
}
 
void format_line(const char* line, char* formatted_line)
{
    static size_t line_counter = 1;
    static int prev_blank = 0;
    if(global_flags[squeeze_blank])
    {
        if(*line == '\n')
        {
            if(prev_blank)
                *formatted_line = '\0';
 
            else
            {
                *formatted_line++ = '\n';
                *formatted_line = '\0';
            }
            prev_blank = 1;
            return;
        }
        else
            prev_blank = 0;
    }
    if(global_flags[number] || global_flags[number_nonblank])
    {
        if(*line == '\n')
        {
            if(!global_flags[number_nonblank])
                sprintf(formatted_line, "%6u  ", line_counter++);
        }
        else
            sprintf(formatted_line, "%6u  ", line_counter++);
    }
    if(global_flags[show_tabs]) // придется читать строку по одному символу
    {
        const char* pl;
        char* pfl;
        for(pl = line, pfl = formatted_line + strlen(formatted_line); *pl; ++pl)
        {
            if(*pl == '\t')
            {
                *pfl++ = '^';
                *pfl++ = 'I';
            }
            else
                *pfl++ = *pl;
        }
        *pfl = '\0';
    }
    else
        strcat(formatted_line, line);
    if(global_flags[show_ends])
    {
        size_t len = strlen(formatted_line);
        if(len)
            --len;
        formatted_line[len] = '$';
        formatted_line[len + 1] = '\n';
        formatted_line[len + 2] = '\0';
    }
}
 
void setup_flags(enum global_flags_enum curr_flag)
{
    global_flags[curr_flag] = 1;
}
 
void print_help(int ret_code)
{
    puts(
        "\n./cat - объединяет файлы и выводит их на стандартный вывод\n"
        "Использование:\n"
        "./cat [OPTION]... [FILE]...\n\n"
        "Доступные опции:\n"
        "\t-A, --show-all\n"
        "\t\tэквивалентно -ET\n"
        "\t-b, --number-nonblank\n"
        "\t\tнумерует непустые строки\n"
        "\t-E, --show-ends\n"
        "\t\tвыводить символ $ в конце каждой строки\n"
        "\t-n, --number\n"
        "\t\tнумерует все строки\n"
        "\t-s, --squeeze-blank\n"
        "\t\tподавляет повторяющиеся пустые строки\n"
        "\t-T, --show-tabs\n"
        "\t\tвыводит символы TAB как ^I\n"
        "\t    --help\n"
        "\t\tвыводит справку\n"
        "Если FILE не задан или задан как -, то читает стандартный ввод");
    exit(ret_code);
}
Тут имеются все флаги и вроде бы все ок, но WinAPI нету, а значит не годится. Переделать, как мне советовали, я смогу, поизучав WinAPI'шки, но к сожалению время поджимает и я могу рассчитывать лишь на вашу помощь. Советы по типу "гугли" или "изучай" пожалуйста не пишите. Надеюсь на вашу помощь. Наверняка есть, уж если не этот код, так похожий в сети. Может вы сможете найти ... Хотя бы чтобы можно было в консольки указать путь к файлу, а он в последствии выведется на нее. Заранее благодарю за помощь !!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.10.2016, 18:28
Ответы с готовыми решениями:

Реализация команды "cat" в консоли Windows
В общем задание следующее: В консоли Linux есть команда &quot;cat&quot;, аналог которой надо сделать под консоль Windows на языке C++. В идеале...

Адаптировать команду head (Unix) WINAPI на Windows
Всем привет, в универе задали задачу адаптировать команду head (Unix)(ключи -c, -n, -help), выводящую первые n строк из файла с помощью...

Графика в консоли с использованием WinAPI
Всем привет, я решил сделать консольную игру с довольно примитивной графикой и выбрал для этого библиотеку windows.h. Порывшись в...

1
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.10.2016, 21:50 2
Цитата Сообщение от Achakoo Посмотреть сообщение
Хотя бы чтобы можно было в консольки указать путь к файлу, а он в последствии выведется на нее.
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int _tmain(int argc, _TCHAR* argv[])
{
    if (argc != 2) return 0;
 
    HANDLE f = CreateFileW(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (f == INVALID_HANDLE_VALUE) return 0;
 
    LARGE_INTEGER sz;
    GetFileSizeEx(f, &sz);
    if (sz.QuadPart > 100 * 1024) return 0;
 
    HANDLE newh = HeapCreate(0, 100 * 1024 + 1, 0);
    if (newh == NULL) return 0;
 
    LPVOID buf = HeapAlloc(newh, 0, sz.QuadPart + 1);
 
    DWORD NumberOfBytesRead;
    if (ReadFile(f, buf, sz.QuadPart, &NumberOfBytesRead, NULL))
    {
        ((char *)buf)[sz.QuadPart] = '\0';
        CharToOemA((char *)buf, (char *)buf);
        HANDLE cons = GetStdHandle(STD_OUTPUT_HANDLE);
        WriteConsoleA(cons, buf, sz.QuadPart, NULL, NULL);
        WriteConsoleA(cons, "\n", 1, NULL, NULL);
    }
    CloseHandle(f);
 
    HeapFree(newh, 0, buf);
    HeapDestroy(newh);
 
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2016, 21:50
Помогаю со студенческими работами здесь

Реализация команд Unix в ОС Windows
Здравствуйте, уважаемые пользователи. Столкнулся вот с такой задачей: &quot;Написать эмулятор команд ОС Unix в Windows&quot;. Суть такова: ввожу...

Реализация команды копирования с использованием перетаскивания (Drag & Drop)
Форма содержит большой список, куда пользователь может добавлять имена файлов, перетаскивая их на форму, поле ввода имени папки и кнопку...

Команды CMD (консоли, командной строки Windows) в Delphi
Может кто уже сталкивался или просто хорошо имеет знания по Delphi или CMD (консоль, командная строка Windows). Вопрос в следущем....

Перенапрвить ввод для команды cat
Народ подскажите как сделать такое: Перенапрвить ввод для команды cat с помощью механизма &quot;файл здесь&quot;, указав слово признака...

Создать флаг -t для команды cat на С
Помогите создать флаг -t, пытался посимвольно поменять, но программа игнорирует, даже если любую другую букву подставить, он лишь символы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Простая нейросеть на КуМир: Создание и обучение
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
Исполнитель Водолей в КуМир: Решение задач
EggHead 16.03.2025
Разработка алгоритмического мышления — одна из ключевых задач для начинающих программистов, и система КуМир предлагает отличный способ погрузиться в этот процесс. Среди множества исполнителей в этой. . .
Исполнитель Чертежник в КуМир: Решение задач
EggHead 16.03.2025
Представьте, что вы можете рисовать на бесконечной координатной плоскости, перемещая точку, которая оставляет след. По вашей команде она может поднять перо и двигаться, не оставляя следа, или. . .
Исполнитель Робот в КуМир: Решение задач
EggHead 16.03.2025
КуМир (Комплект Учебных МИРов) — это учебная среда программирования, разработанная специально для обучения базовым концепциям алгоритмизации. Её главная фишка — использование русскоязычного. . .
Исполнитель Черепаха в КуМир: Решение задач
EggHead 16.03.2025
Представьте, что вы впервые учитесь программировать, а перед вами стоит задача заставить маленькую виртуальную черепашку рисовать на экране. Звучит забавно? Эта идея зародилась ещё в 1967 году, когда. . .
Конвейеры данных с Apache Kafka
Javaican 16.03.2025
В мире, где данные стали новой нефтью, Apache Kafka зарекомендовал себя как мощный инструмент для построения надежных и масштабируемых конвейеров данных. Созданный изначально командой LinkedIn в 2011. . .
Deno против Node.js: Будущее JavaScript рантайма
run.dev 16.03.2025
За последнее десятилетие Node. js стал абсолютным лидером среди JavaScript-рантаймов и фактическим стандартом для серверной разработки на JavaScript. Но в 2018 году тот же разработчик, который создал. . .
SwiftUI или UIKit - что выбрать для нового приложения iOS?
mobDevWorks 16.03.2025
Когда Apple представила SwiftUI на WWDC 2019, многим показалось, что дни UIKit сочтены. Новый декларативный фреймворк предлагал радикально иной подход к разработке интерфейсов. Вместо кропотливого. . .
Docker: Руководство для начинающих по созданию первого приложения
Mr. Docker 16.03.2025
Docker — это платформа, которая упаковывает ваше приложение и все его зависимости в стандартизированные блоки, называемые контейнерами. Эти контейнеры изолированы друг от друга и от основной системы,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер