#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#define BUF_SIZE 4096
char buffer[BUF_SIZE];
int main (int argc, char ** argv)
{
int ifd, i;
FILE * outfile;
ssize_t bytes;
if (argc < 2) {
fprintf (stderr, "Too few arg\n");
return 1;
}
ifd = open (argv[1], O_RDONLY);
if (ifd == -1) {
fprintf (stderr, "cannot open file (%s) \n", argv[1]);
return 1;
}
outfile = fopen ("out", "w");
if (outfile == NULL) {
fprintf (stderr, "cannot open output file (%s) \n");
return 1;
}
while ((bytes = read (ifd, buffer, BUF_SIZE)) > 0)
{
for (i = 0; i < bytes; i++)
if (а с условием сплошные непонятки){
fputc (buffer, outfile);
}
}
close (ifd);
return 0;
}
Работа с файлами
Требуется обработать файл по определенному алгоритму. Файл с текстом следующего вида:
Цитата:
76/5612-01 Галицкий
Геннадий
Калистpатович
76/5614-01 Ильев Виктоp
Hиколаевич
76/5615-01 Павлов Hиколай
Иванович
76/5616-01 Коpолев Виктоp
Александpович
76/5620-01 Hикифоpов
Александp
Алексеевич
Геннадий
Калистpатович
76/5614-01 Ильев Виктоp
Hиколаевич
76/5615-01 Павлов Hиколай
Иванович
76/5616-01 Коpолев Виктоp
Александpович
76/5620-01 Hикифоpов
Александp
Алексеевич
Нужно привести к виду:
Цитата:
76/5612-01 Галицкий Геннадий Калистpатович
76/5614-01 Ильев Виктоp Hиколаевич
76/5615-01 Павлов Hиколай Иванович
76/5616-01 Коpолев Виктоp Александpович
76/5620-01 Hикифоpов Александp Алексеевич
Не уверен, что наглядно показал что надо сделать, но на словах, необходимо убрать лишние переносы строки(т.е. переносов пустых вообще не надо) и сделать имя и фамилию и отчество на одну строку.
Из того, что я успел выучить, предполагаю примерно такой листинг:
Код:
И на этом к сожалениюя встаю в ступор. Я не понимаю какое условие сделать для поставленной задачи.
Будьте добры, кто понял, что нужно сделать, подскажите, или натолкните на мысль.
Заранее благодарю
Да регулярными выражениями пройдитесь по нему и все.
по теме - ты ведь знаешь, что у тебя в каждой строке 4 слова (какие-то числа, фамилия, имя, отчество). ну вот это этого и пляши. собираем слова по 4 штуки, между каждыми четырьмя ставим перенос
побитно считываю файл, если попадаются символы отличные от /n, /t, ' ', я их копирую в буфер, когда попадается один из вышеобозначенных символов, я копирую в буфер символ табуляции и до появления следующего символа ничего не копирую в буфер. Таким образом избавляюсь от лишних пробелов, потом прогоняю файл по новой, и переношу на новую строку, когда попадается символ 7.
Возможно не очень правильный подход, но регулярными выражения, при объеме файла 12 мегабайт, думаю не очень правильно, да и не знаю как это делать.
PS: моя идея пока не работает, пытаюсь разобраться с кодом, если надо кому, ради интереса, могу сюда запостить
Цитата: WantToProg
но регулярными выражения, при объеме файла 12 мегабайт, думаю не очень правильно, да и не знаю как это делать.
А это уже от редактора зависит.
Как сделать: приводим файл к виду все-в-одну-строчку (заменяем переносы, табуляции и двойные пробелы на пробелы до опупения).
Далее ищем (только то что внутри кавычек)
" ([0-9])"
заменяем на
"\n\1"
вроде так.
искать цифры регексами...... ну-ну... целую библиотеку pcre притащим ещё давайте :)
Цитата: WantToProg
Будьте добры, кто понял, что нужно сделать, подскажите, или натолкните на мысль.
На шелле это делается довольно просто:
Код:
user-desktop% paste -s -d' ' test.txt | tr -s ' ' | sed 's| \([[:digit:]]\+/\)|\n\1|g'
76/5612-01 Галицкий Геннадий Калистpатович
76/5614-01 Ильев Виктоp Hиколаевич
76/5615-01 Павлов Hиколай Иванович
76/5616-01 Коpолев Виктоp Александpович
76/5620-01 Hикифоpов Александp Алексеевич
76/5612-01 Галицкий Геннадий Калистpатович
76/5614-01 Ильев Виктоp Hиколаевич
76/5615-01 Павлов Hиколай Иванович
76/5616-01 Коpолев Виктоp Александpович
76/5620-01 Hикифоpов Александp Алексеевич
По пунктам:
- склеили все строки в одну, используя пробел как разделитель
- заменили все повторяющиеся пробелы на один
- заменили строчку вроде " 76/" на "\n76/"
P.S. Специально даже зарегался тут, чтобы ответить. С пятого раза разгдал капчу....