Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с файлами

19K
19 января 2009 года
WantToProg
63 / / 19.01.2009
Доброго времени суток всем читающим данную тему. Уважаемые опытные программисты, дайте подсказку в решении проблемы начинающему.
Требуется обработать файл по определенному алгоритму. Файл с текстом следующего вида:
Цитата:
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 Алексеевич


Не уверен, что наглядно показал что надо сделать, но на словах, необходимо убрать лишние переносы строки(т.е. переносов пустых вообще не надо) и сделать имя и фамилию и отчество на одну строку.

Из того, что я успел выучить, предполагаю примерно такой листинг:

Код:
#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;
}

И на этом к сожалениюя встаю в ступор. Я не понимаю какое условие сделать для поставленной задачи.
Будьте добры, кто понял, что нужно сделать, подскажите, или натолкните на мысль.
Заранее благодарю
14
20 января 2009 года
Phodopus
3.3K / / 19.06.2008
Да регулярными выражениями пройдитесь по нему и все.
355
21 января 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
ну да, как обычно - "если не знаешь, как это сделать, сделай это с помощью регулярных выражений" ;)
по теме - ты ведь знаешь, что у тебя в каждой строке 4 слова (какие-то числа, фамилия, имя, отчество). ну вот это этого и пляши. собираем слова по 4 штуки, между каждыми четырьмя ставим перенос
19K
21 января 2009 года
WantToProg
63 / / 19.01.2009
Там даже не так. Не обязательно 4 слова, может быть и 3. Я решил сделать так:
побитно считываю файл, если попадаются символы отличные от /n, /t, ' ', я их копирую в буфер, когда попадается один из вышеобозначенных символов, я копирую в буфер символ табуляции и до появления следующего символа ничего не копирую в буфер. Таким образом избавляюсь от лишних пробелов, потом прогоняю файл по новой, и переношу на новую строку, когда попадается символ 7.
Возможно не очень правильный подход, но регулярными выражения, при объеме файла 12 мегабайт, думаю не очень правильно, да и не знаю как это делать.
PS: моя идея пока не работает, пытаюсь разобраться с кодом, если надо кому, ради интереса, могу сюда запостить
14
21 января 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: WantToProg
но регулярными выражения, при объеме файла 12 мегабайт, думаю не очень правильно, да и не знаю как это делать.


А это уже от редактора зависит.
Как сделать: приводим файл к виду все-в-одну-строчку (заменяем переносы, табуляции и двойные пробелы на пробелы до опупения).
Далее ищем (только то что внутри кавычек)
" ([0-9])"
заменяем на
"\n\1"
вроде так.

355
23 января 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
искать цифры регексами...... ну-ну... целую библиотеку pcre притащим ещё давайте :)
47K
18 февраля 2009 года
php-coder
1 / / 18.02.2009
Цитата: 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/" на "\n76/"

P.S. Специально даже зарегался тут, чтобы ответить. С пятого раза разгдал капчу....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог