从命名管道读入时,char数组会自动获取附加的空终止符吗?

时间:2016-11-01 16:16:15

标签: c++ c arrays char

我创建了一个包含以下字符数组的结构。

typedef struct {
    char id_size;
    char event_size;
    char userid[10];
    char date[6];
    char start_time[4];
    char end_time[4];
    char event[20];
} CalendarEvent;

我试图从命名管道读入结构后将这些值输出到屏幕。

while(1)
{

    fd = open(myfifo, O_RDONLY);
            //ADD EVENT
            CalendarEvent ev;
            ev = reset;
            if(read(fd, &ev.id_size, 1) > 0){
                printf("%c\n", ev.id_size);
            }
            if(read(fd, &ev.event_size, 1) > 0){
                printf("%c\n", ev.event_size);
            }
            if(read(fd, &ev.userid, 10) > 0){
                printf("%s\n", ev.userid);
            }
            if(read(fd, &ev.date, 6) > 0){
                printf("%s\n", ev.date);
            }
            if(read(fd, &ev.start_time, 4) > 0){
                printf("%s\n", ev.start_time);
            }
            if(read(fd, &ev.end_time, 4) > 0){
                printf("%s\n", ev.end_time);
            }
            if(read(fd, &ev.event, 20) > 0){
                printf("%s\n", ev.event);
            }
            //ev.id_size = int(ev.id_size);
            //ev.event_size = int(ev.event_size);
            ev.userid = ev.userid + '\0';
            list.push_back(ev);
            ev=reset;
            close(fd);

    for(int i=0; i < list.size(); i++){
        std::cout<<"\nName: "<<list[i].userid;
        std::cout<<"\nDate: "<<list[i].date;
        std::cout<<"\nStart time: "<<list[i].start_time;
        std::cout<<"\nEnd time: "<<list[i].end_time;
        std::cout<<"\nEvent: "<<list[i].event;
        std::cout<<"\n";
    }        
}

然而,当我运行这个程序时,我会收到以下输出(仅针对cout):

Name: robert123410311608000900meeting
Date: 10311608000900meeting
Start_time: 08000900meeting
End_time: 0900meeting
Event: meeting

它应该如下:

Name: robert
Date: 103116
Start_time: 0800
End_time: 0900
Event: meeting

我认为这是一个问题,直到它看到一个空的终结符,所有的流一直读取,但我很困惑为什么它没有在结构的每个元素上找到一个,只在最后。所以我想我的问题是,是否需要手动将null终止符附加到这些char数组?如果是这样,那会影响我所生成的char数组的长度吗?

如果我能提供任何其他信息或背景,请告诉我!

1 个答案:

答案 0 :(得分:0)

  

从命名管道读入时,char数组会自动获取一个空终结符吗?

标准read系统调用逐字返回数据。

这是因为此调用不知道目标类型:它读入void*

您仍然可以打印这些char数组而无需附加零终止符,例如:

printf("%.*s\n", static_cast<int>(sizeof ev.end_time), ev.end_time);