Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Veyron
107 / 107 / 9
Регистрация: 02.06.2009
Сообщений: 578

Правильное использование readv и writev

25.10.2011, 17:12. Показов 2555. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла проблема с программированием указанных системных вызовов. Есть программа, которая пишет в файл с использованием разбросанного ввода/вывода, и программа, отображающая вывод первой программы.

Первая:
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
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/uio.h>
 
int main()
{
    struct iovec iov[3];
    ssize_t nr;
    int fd,i;
 
    char *buf[] = {
            "The term buccaneer comes from the word bucan.\n",
            "A boucan is a wooden frame used for cooking meat.\n",
            "Buccaneer is the West Indies name for a pirate.\n"};
    fd = open("buccaneer.txt", O_WRONLY | O_CREAT | O_TRUNC);
    if (fd == -1)
    {
        perror("open");
        return 1;
    }
    for (i=0;i<3;i++)
    {
        iov[i].iov_base=buf[i];
        iov[i].iov_len=strlen(buf[i]);
    }
    nr = writev(fd, iov, 3);
    if (nr == -1)
    {
        perror("writev");
        return 1;
    }
    printf("wrote %d bytes.\n", nr);
    if (close(fd))
    {
        perror("close");
        return 1;
    }
    return 0;
}
Вторая:
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
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/uio.h>
 
int main()
{
    char foo[46], bar[50], baz[48];
    struct iovec iov[3];
    ssize_t nr;
    int fd, i;
    fd = open("buccaneer.txt", O_RDONLY);
    if (fd == -1)
    {
        perror("open");
        return 1;
    }
    iov[0].iov_base = foo;
    iov[0].iov_len = sizeof(foo);
    iov[1].iov_base = bar;
    iov[1].iov_len = sizeof(bar);
    iov[2].iov_base = baz;
    iov[2].iov_len = sizeof(baz);
    nr = readv(fd, iov, 3);
    if (nr == -1)
    {
        perror("readv");
        return 1;
    }
    for (i=0;i<3;i++)
        printf("%d: %s", i, (char *) iov[i].iov_base);
    if (close(fd))
    {
        perror("close");
        return 1;
    }
    return 0;
}
Проблема в том, что вторая программа выводит то, что первая программа записала, в следующем виде:
Code
1
2
3
4
5
6
0: The term buccaneer comes from the word bucan.
 
1: A boucan is a wooden frame used for cooking meat.
 
2: Buccaneer is the West Indies name for a pirate.
The term buccaneer comes from the word bucan.
Почему после третьей строки выводится первая очередной раз?

Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2011, 17:12
Ответы с готовыми решениями:

Правильное использование fopen и fgets/fgetc
Возникла проблема, раньше я использовал конструкцию для чтения файла в текстовом режиме с чтением в буффер фиксированной длины (1025),...

Правильное использование EntityFramework
Всем привет. Замучал меня теоретический вопрос: Вот представим что есть некая сущность. И есть у нее поля. Мне необходимо проверять...

Правильное использование указателя
В программе пишутся данные с UDP, программа намного больше описанного здесь, просто меня интересует только конкретно задаваемый мной...

5
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.10.2011, 18:37
Вы читаете _не_ строки.
0
 Аватар для Veyron
107 / 107 / 9
Регистрация: 02.06.2009
Сообщений: 578
26.10.2011, 00:33  [ТС]
Понятно, что читаю не строки.
А вот вывести надо строки. А получается нечто иное.
В файле получается 4 строки, последняя пустая. Почему четвертая выводится вне цикла, и почему именно первая?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 09:05
Цитата Сообщение от Veyron Посмотреть сообщение
Понятно, что читаю не строки.
А вот вывести надо строки. А получается нечто иное.
Так может если Вы все понимаете, нужно сделать из "не строк" строки?
Цитата Сообщение от Veyron Посмотреть сообщение
Почему четвертая выводится вне цикла, и почему именно первая?
Это не совсем так, зависит от компилятора и системы, мусор может появиться после 1го же printf() т.к \0 то вам в конце foo,bar и baz никто не обещал...
либо объявите их как static, либо явно закрывайте прочитанное нулем (имхо предпочтительней).
1
 Аватар для Veyron
107 / 107 / 9
Регистрация: 02.06.2009
Сообщений: 578
26.10.2011, 13:45  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Так может если Вы все понимаете, нужно сделать из "не строк" строки?
Не совсем так. Как в строки сделать - не проблема. Просто эти два примера взяты из учебника (не изменены), и хотелось бы понять, почему происходит вот такая вещь.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
26.10.2011, 13:55
Я ж вроде вполне ясно уже 2 раза написал...
Давайте еще разок: Си строка это массив char завершающийся \0, printf("%s", xxx) выводит именно строки, т.е. вывод будет продолжаться до тех пор, пока не встретиться нулевой байт. Вы читаете _не_ строки и где именно будет этот '\0' предсказать не возможно.

Не по теме:

Учебник, в печку его! (с) п.Преображенский.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2011, 13:55
Помогаю со студенческими работами здесь

Правильное использование высоты
Всем привет! Свертал макет страницы. Всё ОК, кроме расположения футера. Дело в том, что у него стоит фиксированная ширина. И при...

Правильное использование remove_if
Написал функцию, которая удаляет из последовательности типо vector элементы меньшие её среднего значения в 2 раза. Среднее значение...

Правильное использование семафоров
Добрый день, использую семафоры для записи чтения двумя потоками в кольцевой буффер. схематично, это происходит так: ...

Сокет и правильное использование их
такая проблема у меня- на компьютере работает сервер, прослушивающий порт. На телефоне - клиент, который пишет сообщение. на эмуляторах...

Правильное использование тега br
Подскажите, а в каким случаях стоит использовать &lt;br&gt;? Когда не надо (плохой тон) и какая ему есть замена?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru