Форум программистов, компьютерный форум CyberForum.ru

реализация cat в с++ - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Наверно работа со строками http://www.cyberforum.ru/cpp-beginners/thread226640.html
Задача немного не понятная мне,помогите плз. У задачи есть требования : Подготовить тхт файл с входными данными. Разбить программу на функции ввода,обработки и вывода Входные данные читать из файла Вывести результаты на экран и дозаписать в файл А теперь само задание: Текст в файле "В науке есть радость.Наука приносит удовольствие". Используя функции обработки строковых и символьных...
C++ строки. Вводится последо-вательность строк символов не длиннее 40 символов. Допустимые символы в строке - русские буквы и пробел. Окончание входного потока - ввод строки, начинающейся с символа "*". Максималь-ное количество строк равно 5. Затем выделяются отдельные слова - последовательности букв, разделенных пробелами. Из исходных слов формируются их сокращения путем удаления гласных букв, например:... http://www.cyberforum.ru/cpp-beginners/thread226636.html
C++ Как записать формулу
как мне записать формулу в с++: А (в степени n)=2(в степени n)*n! (n факториал)/ n (в степени n) пожалуста без лишних сообщей только формула
C++ Линейные списки и бинарные деревья
Доброго времени суток всем! Помогите пожалуйста написать часть кода. Линейный список содержит указатели на корни бинарных деревьев, хранящих целые числа. Необходимо удалить все деревья ( и соответствующие узлы списка), сумма чисел в которых превосходит введенное с клавиатуры число. З.Ы. Знакомый на переписке экзамена по программированию)
C++ Создать класс, содержащий поля, которые можно использовать для хранения данных http://www.cyberforum.ru/cpp-beginners/thread226619.html
Создать класс <имя класса> (имя класса задается в соответствии с выбранным вариантом), содержащий поля, которые можно использовать для хранения данных. Предусмотреть инициализацию переменных (полей) класса, помещение данных в переменные и извлечение данных.
C++ файлы Помогите решить задачу, пожалуйста. Дан текстовый файл f. Исключить пробелы, стоящие в концах его строк. Результат поместить в файл f1. Заранее спасибо!!! подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.01.2011, 20:49     реализация cat в с++
Вот на С, может читать стандартный ввод:
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
#include <stdio.h>
#include <stdlib.h>
 
void print_file(const char*);
 
int main(int argc, char* argv[])
{
    if(argc == 1)
        print_file("-");
        
    int i;
    
    for(i = 1; i < argc; ++i)
        print_file(argv[i]);
 
    exit(0);
}
 
void print_file(const char* file)
{
    FILE* f;
    static char buf[BUFSIZ];
    if(strcmp(file, "-") == 0)
        f = stdin;
    else if((f = fopen(file, "r")) == NULL)
    {
        perror("cat");
        return;
    }
    
    while(fgets(buf, BUFSIZ, f))
        if(fputs(buf, stdout) == EOF)
        {
            perror("cat");
            break;
        }
        
    if(ferror(f))
        perror("cat");
        
    if(f != stdin)
        fclose(f);
}
Добавлено через 1 час 59 минут
А вот с поддержкой большинства опций cat (под *nix!):
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
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
#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);
void print_version();
 
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'},
            {"version",         0, NULL, 'v'},
            {NULL,              0, NULL,  0 },
        };
        
        c = getopt_long(argc, argv, "AbEnsT", options, &index);
        
        if(c == -1)
            break;
        
        switch(c)
        {       
        case 'h':
            print_help(0);
            
        case 'v':
            print_version();
            
        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"
        "\t    --version\n"
        "\t\tвыводит информацию о версии программы\n\n"
        "Если FILE не задан или задан как -, то читает стандартный ввод");
    exit(ret_code);
}
 
void print_version()
{
    puts(
        "\n./cat 1.0\n"
        "Copyleft (CL) 2010\n"
        "Бла-бла-бла и так далее про лицензии и распространение..."
        );
    exit(0);
}
 
Текущее время: 08:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru