我创建了一个包含以下字符数组的结构。
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数组的长度吗?
如果我能提供任何其他信息或背景,请告诉我!
答案 0 :(得分:0)
从命名管道读入时,char数组会自动获取一个空终结符吗?
标准read
系统调用逐字返回数据。
这是因为此调用不知道目标类型:它读入void*
。
您仍然可以打印这些char
数组而无需附加零终止符,例如:
printf("%.*s\n", static_cast<int>(sizeof ev.end_time), ev.end_time);