2016-11-01 1 views
3

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!

+4

Nein, sind sie nicht. 'read()' macht das nie. Sie könnten dies selbst leicht mit Ihrem Debugger überprüfen. –

+6

Du liest von Pfeifen was genau drin stand, nichts mehr. –

+0

Sie sollten auch berücksichtigen, dass 'read (fd, data, n)' eine beliebige Anzahl von Bytes von 0 bis n und alles dazwischen lesen kann. –

Antwort

0

Wenn Sie von einer Named Pipe eingelesen werden, erhalten Char-Arrays automatisch einen Null-Terminator angehängt?

Der Standard read Syscall gibt Daten wörtlich zurück.

Dies liegt daran, dass dieser Aufruf keine Zieltypen kennt: Er liest sich in void*.

Sie können immer noch die char Arrays drucken, ohne die Null-Terminators anzuhängen mit, z.B .:

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

Also müsste ich jedem Element der Struktur ein zusätzliches Zeichen hinzufügen, um einen Nullabschluss zu haben, damit sie korrekt ausgegeben werden können? –

+0

@RobertWhitmer Das ist richtig. Alternativ können Sie sie als 'printf ("%. * S \ n ", static_cast (sizeof ev.end_time), ev.end_time);' drucken, ohne einen Nullabschluss anzuhängen. –

+0

Vielen Dank! –

Verwandte Themen