2016-10-22 9 views
0

Ich bin nicht so sicher, wenn die Funktion printf in C eine negative Zahl zurückgeben wird. Ich weiß, dass printf eine negative Zahl, am wahrscheinlichsten -1, zurückgibt, wenn es eine Zeichenfolge nicht drucken konnte. Aber ich möchte wissen, warum und wann es eine Zeichenfolge nicht drucken wird. Zum Beispiel meines Code hier:Wann gibt printf eine negative Zahl zurück?

#include<stdio.h> 
    #include<stdlib.h> 
    #include<string.h> 
#pragma pack(1) 
typedef struct{ 
    char name[14]; 
    int age; 
    int yearofbirth; 
}person; 
int print(person var) 
{ 
    if(printf("%s\n", var.name)<0) 
    { 
     if(printf("%d\n", var.age)<0) 
     { 
      if(printf("%d\n\n", var.yearofbirth)<0) 
      { 
       return 1; 
      } 
     } 

    } 
    return 0; 
} 
int main(void) 
{ 
    int i=0; 
    person thing; 
    FILE* file=fopen("Data.txt", "r"); 
    if(file) 
    { 
     long amountofstruct = 0; 
     char* z=(char*)malloc(sizeof(char)*200); 
     while(fgets(z,100,file)!=NULL) 
     { 
      amountofstruct++; 
     } 
     fseek(file,0,SEEK_END); 
     free(z); 
     int k=0; 
     /* while(k<amountofstruct) 
     { 
      fseek(file,sizeof(person)*k,SEEK_SET); 
      fread(&function[k], sizeof(person),1,file); 
      k++; 
     } 
     int szt; 
     printf("%p",function); 
     for(szt=0;szt<amountofstruct;szt++) 
     { 
      printf("Person %d:\tName:%s\t Age:%i\t Year Of Birth:%i\n",szt+1,function[szt].name,function[szt].age,function[szt].yearofbirth); 
     }*/ 
     printf("thesizeofstruct:%ld\n",sizeof(person)); 
     printf("%ld",amountofstruct); 
//thing.name = {' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'}; 

     char *l = (char*)malloc(11); 
     while(k<amountofstruct) 
     { 

      fseek(file,sizeof(person)*k,SEEK_SET); 
      if(fread(&thing, sizeof(thing), 1, file)!=0) 
      { 
       thing.name[13]='\0'; 
       // printf("sizeof(thing string)%lu\n sizeof(thing)%lu\n", sizeof(thing.name),strlen(thing.name)); 
       if(print(thing)==0) 
       { 
        printf("\nThe thing failed, sorry"); 
        return 0; 
       } 
       //char *p = strchr(thing.name, ' '); 
       // *p='\0'; 
      // strcpy(l,thing.name); 
       //printf("Person %d: \t Name: %s\t Age: %d\t Year Of Birth: %d\n", k+1, l, thing.age, thing.yearofbirth); 
     //  thing.name[0]='\0'; 
      //  thing.age=0; 
      //  thing.yearofbirth=0; 
       k++; 
      } 
     } 
     free(l); 
    } 
    else 
    { 
     perror("The file could not be opened"); 
    } 
    getchar(); 
    return 0; 
} 

die printf Druck der ganzen Zahlen var.age und var.yearofbirth in Funktion Druck gibt immer eine negative Zahl. Die Zeile

printf("%s\n", var.name); 

im Funktionsdruck gelingt, aber das ist alles. Aber in meiner Data.txt wird das Alter und das Geburtsjahr jeder Person sehr klar wie folgt angegeben.

Name Age YearofBirth 

Warum wird printf eine negative Zahl zurückgeben? Danke,

+0

Mögliches Duplikat von [Rückgabewert der Funktion printf() in C] (http://stackoverflow.com/questions/7055882/return-value-of-printf-function-in-c) – John3136

+3

Ihre zwei nachfolgenden 'printf 's werden nicht einmal ausgeführt, wenn der erste erfolgreich ist und etwas Positives zurückgibt. – tkausl

+1

Die [man-Seite] (https://linux.die.net/man/3/printf) besagt, dass 'wenn ein Ausgabefehler auftritt, ein negativer Wert zurückgegeben wird. '. Wenn das passiert, schauen Sie sich [errno] (https://linux.die.net/man/3/errno) an, um herauszufinden, was falsch gelaufen ist. Und eine sanfte Bitte: das nächste Mal bitte säubern Sie Ihren Code, bevor Sie schreiben, diese auskommentierten Blöcke haben nichts mit dem Problem zu tun, das Sie haben, und es macht es schwer, den Code zu lesen, und sieht unordentlich aus. – fvu

Antwort

0

printf(3)-1 beispielsweise zurück, wenn Sie fclose(3) der FILE Descriptor vor ihm verbunden printf() zu rufen. Ein anderes Beispiel ist, wenn ein anderer Prozess Ihren Dateideskriptor widerrufen hat oder wenn der Datenträger voll mit Daten ist oder wenn Sie das Datenträgerkontingent überschreiten oder wenn der Socket aus irgendeinem Grund geschlossen wird (Fall stdout ist einem Socket zugeordnet). Es gibt viele Dinge, die die printf(3) Familie von Funktionen -1 zurückgeben können. Normalerweise ist dies mit externen Ereignissen verbunden, die den Systemaufrufen zugeordnet sind, die es intern ausführt. Angenommen, Sie sind printf() zu einer Pipe, und der Lesevorgang (derjenige, der Ihre Daten empfängt) stirbt plötzlich. Ihr printf() wird nicht write(2) die Pufferdaten und erhalten einen Fehler von write(2), dann wird -1 zurückgeben und Sie müssen errno für die tatsächliche Ursache des Fehlers überprüfen.