Работа с файлами(Си) (Помогите создать условие)

Модератор: Модераторы разделов

WantToProg
Сообщения: 1
ОС: ubuntu 7.10

Работа с файлами(Си)

Сообщение WantToProg »

Доброго времени суток всем читающим данную тему. Уважаемые опытные программисты, дайте подсказку в решении проблемы начинающему.
Требуется обработать файл по определенному алгоритму. Файл с текстом следующего вида:
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[i], outfile);
        }
    }

    close (ifd);
    return 0;
}

И на этом к сожалениюя встаю в ступор. Я не понимаю какое условие сделать для поставленной задачи.
Будьте добры, кто понял, что нужно сделать, подскажите, или натолкните на мысль.
Заранее благодарю
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Работа с файлами(Си)

Сообщение Voice »

Если Вам просто преобразовать файл, то Вы выбрали не самый оптимальный язык для ее решения.
Лучше реализовать это на на bash/sed/awk/perl...
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Работа с файлами(Си)

Сообщение Voice »

Вот примерно так:

Код: Выделить всё

#!/usr/bin/perl

$record_line = "";

while($line = <>) {
    chomp($line);

    if($line =~ /\S+/) {
    if($line =~ /^\d+/) {
        if($record_line != "") {
                print $record_line, "\n";
        }

            $record_line = $line;
        } else {
        $record_line .= " "    . $line;
        }
    }
}

print $record_line, "\n";


запускать так: perl foo.pl < names
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Работа с файлами(Си)

Сообщение RasenHerz »

Код: Выделить всё

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

#define IS_SPACE(a) ((a) == ' ')
#define IS_NEWLN(a) ((a) == '\n')

void parse_buff(char*, int, char*);

int main(int argc, char *argv[]){
    char msg[] = "Hello World\n\n    This   is  testing application.\n";
    int len = strlen(msg);
    char *buff = new char[len+1];
    parse_buff(msg, len, buff);
    printf("%s", msg);
    printf("Parsed string\n");
    printf("%s", buff);
    return 0;
}

void parse_buff(char *buff, int len, char *out_buff){
    if (!buff || !out_buff || len <= 0)
        return;
    int i = 1, j = 0;
    memset(out_buff, 0x0, len);
    if (!IS_SPACE(buff[0])){
        out_buff[0] = buff[0];
        j = 1;
    }
    for (; i < len; i++){
        if (IS_NEWLN(buff[i]) && IS_NEWLN(buff[i-1])) /* "\n\n */
            continue;
        else if (IS_SPACE(buff[i]) && IS_SPACE(buff[i-1])) /* "  " */
            continue;
        else if (IS_SPACE(buff[i]) && IS_NEWLN(buff[i-1])) /* "\n " */
            continue;
        else if (IS_NEWLN(buff[i]) && IS_SPACE(buff[i-1])) /* " \n" */
            continue;
        else {
            out_buff[j] = buff[i];
            j++;
        }
    }
}

Функция parse_buff обработает строку buff и скопирует ее в out_buff. Единственное что тебе осталось, считать буффер из файла и передать его на обработку.
Спасибо сказали:
ironclad
Сообщения: 14
ОС: Fedora 7 x86-64

Re: Работа с файлами(Си)

Сообщение ironclad »

Вот проверенный вариант решения задачи при условии что всегда имеется четыре параметра: код и ФИО.

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc<3)
    {
       printf("Недостаточно параметров!\n");
       return(1);
    }
    FILE *f=fopen(*++argv,"r");
    FILE *f2=fopen(*++argv,"w");
    if (f==NULL||f2==NULL)
    {
      printf("Ошибка открытия файла для ввода и/или вывода!\n");
      return(1);
    }
    char buf[100];
    while (!feof(f))
    {
        int i;
        for(i=0;i<3;i++)
        {
            if (fscanf(f,"%s",buf))
            {
                fprintf(f2,"%s ",buf);
            }
        }
        if (fscanf(f,"%s",buf))
        {
            fprintf(f2,"%s\n",buf);
        }
    }
    fclose(f);
    fclose(f2);
    return (0);
}
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Работа с файлами(Си)

Сообщение Folderx »

4_strings.c

Код: Выделить всё


#include <stdio.h>

#define MAXWORD  100   /* максимальная длина слова */

/* считывает и выводит в строке по 4 значения
   из потока ввода в поток вывода  */
main()
{
    char word[MAXWORD];
    int n;

    for (n = 0; scanf("%s", word) == 1 && ++n; )
        printf("%s%s", word, n == 4 ? n = 0, "\n" : " ");
    return 0;
}


Код: Выделить всё

[guest@station tmp]$ cat in.txt | ./4_strings > out.txt
[guest@station tmp]$ cat out.txt
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 Алексеевич
[guest@station tmp]$


in.txt

Код: Выделить всё

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

Алексеевич
Спасибо сказали: