Очистка трубы после второго ввода - PullRequest
0 голосов
/ 09 мая 2018

Я новичок здесь и я новичок в программировании на Си. У меня проблема с использованием каналов для копирования одного файла в другой. Мой размер буфера равен 10. Когда я копирую из моего файла in.txt в out.txt, всегда остается «p» в конце таблицы символов. Это просто потому, что мой последний ввод содержит только 9 символов, а десятый символ от предыдущего ввода. "читатель: msg88 = как нулла р читатель: msg89 = ariatur? п «

Что я должен сделать, чтобы почистить свой стол с символами? Я не хочу, чтобы последний "р" на MSG89. Мне нужно, чтобы это были те же файлы, но in.txt не содержит «p» в конце, а out.txt содержит. Когда я использую md5sum, это не то же самое:

197ee73779d545f0d3dc7981131736c0  in.txt
ed36f720a1ffc7e82983545d6305edc3  out.txt

Код:

filefd = open(argv[1], O_RDONLY, 0);
for(int i = 0; read(filefd, message, 10) > 0; i++)
{
    printf("writer: msg%d=%s\n", i+1, message);
    fflush(stdout);
    write(fd[1], message, 10);
    usleep(100000);
}


filefd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
for(int i = 0; read(fd[0], message, 10) > 0; i++)
{
    printf("reader: msg%d=%s\n", i+1, message);
    fflush(stdout);
    write(filefd, message, 10);
    usleep(120000);
}                       

1 Ответ

0 голосов
/ 09 мая 2018

read возвращает количество прочитанных байтов, поэтому вы должны иметь возможность сделать что-то вроде:

ssize_t bytesread;
for (int i = 0; (bytesread = read(fd[0], message, 10)) > 0; i++)
{
  ...
  write(filefd, message, bytesread);
  ...
}

Идея состоит в том, чтобы проверить количество байтов, прочитанных при вызове read (я храню его в переменной с именем bytesread), и передать это число в вызов write вместо того, чтобы всегда пропускать 10.

Полагаю, вы внесете аналогичные изменения в обе части кода, которые вы опубликовали.

...