Ich habe eine Struktur erstellt, die die folgenden Zeichenfelder enthält.Wenn Sie von einer Named Pipe eingelesen werden, erhalten Char-Arrays automatisch einen Null-Terminator angehängt?
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;
Ich versuche, diese Werte auf dem Bildschirm auszugeben, nachdem ich von einer Named Pipe in eine Struktur gelesen habe.
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";
}
}
Allerdings, wenn ich dieses Programm ausführen, erhalte ich die folgende Ausgabe (nur für die cout):
Name: robert123410311608000900meeting
Date: 10311608000900meeting
Start_time: 08000900meeting
End_time: 0900meeting
Event: meeting
Während es die folgenden sein sollte:
Name: robert
Date: 103116
Start_time: 0800
End_time: 0900
Event: meeting
Ich nehme an Dies ist ein Problem, bei dem die Streams vollständig gelesen werden, bis ein Null-Terminator angezeigt wird, aber ich bin verwirrt, weil es keinen für jedes Element der Struktur und nur am Ende findet. Ich nehme an, meine Frage ist, ob es notwendig ist, dass ich manuell an Null-Terminatoren an diese Char-Arrays angehängt werde? Wenn ja, würde das dann die Länge der Char Arrays beeinflussen, die ich gemacht habe?
Bitte lassen Sie mich wissen, wenn es andere Informationen oder Zusammenhänge gibt, die ich geben kann!
Nein, sind sie nicht. 'read()' macht das nie. Sie könnten dies selbst leicht mit Ihrem Debugger überprüfen. –
Du liest von Pfeifen was genau drin stand, nichts mehr. –
Sie sollten auch berücksichtigen, dass 'read (fd, data, n)' eine beliebige Anzahl von Bytes von 0 bis n und alles dazwischen lesen kann. –