2016-12-17 6 views
0

Ich habe eine Struktur, eine TXT-Datei, die ich lesen möchte und den folgenden Code, der gut funktioniert. Ich versuche, eine Funktion zu machen, die meisten der gelesenen Dateifunktionen dort sind aber scheinen Probleme mit lokalen Variablen zu haben, etc ..Eine Datei über eine Funktion + Struktur lesen

#include <stdio.h> 
#include <string.h> 

int i,j,numberofseats,temp; 
char platenr[8],selection,buff[60]; 
char firstname[20]; 
char lastname[20]; 
char phone[11]; 
char *p; 
typedef struct 
    { 
    char fullname[40]; 
    unsigned short phonenr[10]; 
    unsigned int seatnr; 
    }PASSENGERS; 
int main(void) 
{ 


FILE *businfo;           
businfo = fopen ("bus.txt","r");       
if (businfo == NULL)                   
{ 
    printf("Error Opening File, check if file bus.txt is present"); 
    exit(1); 
} 
fscanf(businfo,"%s %d",platenr, &numberofseats); 
printf("Bus Licence plate Nr is: %s and number of seats is: %d", platenr, numberofseats); 
PASSENGERS passenger[numberofseats]; 
for (j=0;j<numberofseats;j++) 
    {passenger[j].seatnr=j+1; 
    strcpy(passenger[j].fullname,"\0"); 
    } 

while (fgets(buff,sizeof(buff),businfo))  
{sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone); 
strcpy(passenger[temp-1].fullname,firstname); 
    strcat (passenger[temp-1].fullname, " "); 
    strcat(passenger[temp-1].fullname,lastname); 
    i=0; 
    for (p=phone;*p!='\0';p++)  
     { 
     (passenger[temp-1].phonenr[i])=*p -'0'; 
     i++; 
     } 
} 

So nach dem Code, der funktioniert, ist dies die Funktion, die ich erstellt,

wo Ziel definiert werden sollte,

die Struktur zu aktualisieren, aber das * Ziel ist noch nicht bekannt, da sie in der txt-Datei (die temporäre Variable) ist, die durch die Funktion gelesen werden, wird sich ..

Das ist macht mich verrückt!

void readfile(PASSENGERS *target, FILE *businfo){ 
while (fgets(buff,sizeof(buff),businfo))  
{sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone); 
strcpy(target->fullname,firstname); 
    strcat (target->fullname, " "); 
    strcat(target->fullname,lastname); 
    i=0; 
    for (p=phone;*p!='\0';p++)   
     { 
     (target->phonenr[i])=*p -'0'; 
     i++; 
     } 
}} 
+0

Bitte erläutern Sie, warum Sie eine ASCII-Anpassung an die Telefonnummer vornehmen, anstatt sie als Zeichenfolge zu belassen. Sie haben die Endmarkierung verloren, da jede "0" in der Telefonnummer zu einer Endmarkierung wird. –

+0

Ich weiß, dass es eine Zeichenfolge sein könnte, aber es ist Teil der Übung, die ich versuche zu lösen, in einer Struktur die Telefonnummer als eine unsignierte kurze Reihe [10] zu speichern .. Also kein Grund dafür .. aber es funktioniert gut, wie es ist .. Die Probleme beginnen, wenn ich versuche, meinen Arbeitscode in eine Funktion zu konvertieren, die ich im Hauptteil aufrufen. Die Funktion im zweiten Fenster zum Beispiel funktioniert nicht .. – baskon1

+0

Sie müssen speichern die * Länge * der Telefonnummer auch. –

Antwort

0

Sehen Sie sich den Unterschied zwischen der von Ihnen erstellten Readfile-Funktion und dem reinen Code in der Hauptfunktion an. Das Problem besteht darin, dass Sie die Array-Passagiere korrekt füllen, indem Sie jedes Element (Passagier [temp-1]) in Ihrer Hauptfunktion indizieren, aber die Funktion readfile nur jedesmal das erste Element des Arrays füllt, wenn die while-Schleife ausgeführt wird.

Es gibt zwei Lösungen:

1. Lösung: der Zeiger Zielpunkte auf dem gleichen Element (erste), sobald die Funktion (fill jedes Element unter Verwendung von (target + temp-1) ->) ausgeführt wird

void readfile(PASSENGERS *target, FILE *businfo) 
{ 
    while (fgets(buff,sizeof(buff),businfo))  
    { 
     sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone); 
     strcpy((target+temp-1)->fullname,firstname); 
     strcat ((target+temp-1)->fullname, " "); 
     strcat((target+temp-1)->fullname,lastname); 
     i=0; 
     for (p=phone;*p!='\0';p++)   
     { 
      ((target+temp-1)->phonenr[i])=*p -'0'; 
      i++; 
     } 
    } 
} 

2. Lösung: die Zeiger Zielpunkte auf das letzte nicht-null-Element in dem Array, wenn die Funktion ausgeführt wird (den Zeiger am Ende der while-Schleife inkrementieren)

void readfile(PASSENGERS *target, FILE *businfo) 
{ 
    while (fgets(buff,sizeof(buff),businfo))  
    { 
     sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone); 
     strcpy(target->fullname,firstname); 
     strcat (target->fullname, " "); 
     strcat(target->fullname,lastname); 
     i=0; 
     for (p=phone;*p!='\0';p++)   
     { 
      (target->phonenr[i])=*p -'0'; 
      i++; 
     } 

     target = target + temp - 1; 

    } 
} 
+0

Warum verwenden Sie 'strcpy ((target + temp-1) -> fullname, Vorname);' anstelle von 'strcpy ((target [temp-1] .fullname, Vorname);'? –

+0

Auch in beiden Funktionen sollten Sie ermutigen Sie das OP, die Größe des Arrays an die Funktion zu übergeben, damit die Funktion stoppen kann, bevor Pufferüberlaufprobleme auftreten. –

0

Tha Danke für den Rat alle! Ich habe die Variablen als global, weil ich sie weiter unten in meinem Programm benötigen .. Was ich getan habe, ist die meisten der Datei lesen Code auf die Funktion, die ich eingestellt, um keine iputs und Ausgänge zu haben .. Ich mache auch die Initialisierung der Struktur durch die Platzierung von \ 0 in Passagiernamen, und ein Sitz Nr von 1 bis Anzahl der Plätze. Ich möchte für jede Zeile der TXT-Datei das Programm lesen Sie die Temperatur, und dann in der Struktur PASSENGERS ändern Sie die Werte passagier [temp] Das Problem ist, dass zu dieser Zeit alles ruiniert wird und wenn es läuft Chaos mit seltsamen Werten erscheint. Ich habe den ganzen Code für den Fall, dass Sie es ausführen wollen, aber das Problem ist nur am Anfang ..

#include <stdio.h> 
#include <string.h> 

int i,j,numberofseats,temp; 
char platenr[8],selection,buff[60]; 
char firstname[20]; 
char lastname[20]; 
char phone[11]; 
char *p; 
typedef struct 
    { 
    char fullname[40]; 
    unsigned short phonenr[10]; 
    unsigned int seatnr; 
    }PASSENGERS; 

void readfile(void) 
{ 
    FILE *businfo; 
    businfo = fopen ("bus.txt","r"); 
    if (businfo == NULL) 
     { 
     printf("Error Opening File, check if file bus.txt is present"); 
     exit(1);} 
    else 
     { 
     fscanf(businfo,"%s %d",platenr, &numberofseats); 
     printf("Bus Licence plate Nr is: %s and number of seats is: %d", platenr, numberofseats); 
     PASSENGERS passenger[numberofseats]; 
     for (j=0;j<numberofseats;j++) 
      {passenger[j].seatnr=j+1; 
      strcpy(passenger[j].fullname,"\0"); 
      } 
     while (fgets(buff,sizeof(buff),businfo)) 
      {sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone); 
      strcpy(passenger[temp-1].fullname,firstname); 
      strcat (passenger[temp-1].fullname, " "); 
      strcat(passenger[temp-1].fullname,lastname); 
      i=0; 
      for (p=phone;*p!='\0';p++) 
       { 
       (passenger[temp-1].phonenr[i])=*p -'0'; 
       i++; 
       } 
      } 
      } 
} 


int main(void) 
{ 
readfile(); 
PASSENGERS passenger[numberofseats]; 
    do{ 
    printf("\n\nNeo Sistima katagrafis thesewn leoforeiou\n"); 
    printf("Please make a selection:\n\n"); 
    printf("0. Exit\n"); 
    printf("1. Empty Seats \n"); 
    printf("2. Book Specific Seat \n"); 
    printf("3. Advanced Search of booked Seats\n"); 
    printf("4. Cancel Seat Booking\n"); 
    printf("5. Show List of booked Seats\n"); 
    scanf(" %c",&selection); 

    if (selection=='1') 
     {int freeseats = 0; 
     for (j=0; j<numberofseats; j++) 
      { 
      strcmp(passenger[j].fullname,"\0")==0 ? freeseats = freeseats + 1 : freeseats ;} 
      printf ("There are %d free seats in this bus \n", freeseats); 
      printf("Seats that are available are:\n"); 

     for (j=0; j<numberofseats; j++) 
      {if (strcmp(passenger[j].fullname,"\0")==0) 
       printf ("%u\n", passenger[j].seatnr); 
      } 
     freeseats = 0; 
     } 

    else if (selection=='2') 
     { 
     printf("Please give seat nr (between 1 and %d) that you want to book:\n", numberofseats); 
     scanf("%d",&temp); 
     if (temp >numberofseats || temp <= 0) 
      {printf("Error: Seat nr should be between 1 and %d", numberofseats);} 
     else if (strcmp(passenger[temp-1].fullname,"\0")!=0) 
      printf("Error: Seat is already booked"); 

     else 
     changeData(&passenger[temp-1]); 

     } 

else if (selection=='3') 
     { 
     char tempsel,tmpfirst[20],tmplast[20]; 
     unsigned short tempphone[10]; 
     int counter, checkphone; 
     unsigned int tempseat; 
     printf("Do you want to search with Name (1) or Phone Nr (2)?\n"); 
     scanf(" %c",&tempsel); 

     if (tempsel == '1') 
     { printf("Enter passenger first name:"); 
      scanf("%s",tmpfirst); 
      printf("Enter passenger last name:"); 
      scanf("%s",tmplast); 
      strcat (tmpfirst, " "); 
      strcat(tmpfirst,tmplast); 
      for (j=0;j<numberofseats;j++) 
      if (strcmp(passenger[j].fullname,tmpfirst)==0) 
       printf ("passenger %s has seat nr #: %u\n",tmpfirst,passenger[j].seatnr); 
     } 
     else if (tempsel == '2') 
     { checkphone=0; 
      printf("Enter passenger phonenr:"); 
      for (i=0;i<10;i++) 
      scanf("%hu",&tempphone[i]); 
      for (j=0;j<numberofseats;j++) 
       { 
       counter=0; 
       for(i=0;i<10;i++) 
        { 
       if (passenger[j].phonenr[i]==tempphone[i]) 
        counter=counter+1; 
        if (counter ==10) 
        {checkphone=1; 
        tempseat=passenger[j].seatnr; 
        }} 
       } 
       if (checkphone==1) 
       {printf ("passenger has seat #: %u\n",tempseat); 
       checkphone=0;} 

     } 
     } 



    else if (selection=='4') 
     { 
     printf("Please give seat nr (between 1 and %d) that you want to cancel booking:\n", numberofseats); 
     scanf("%d",&temp); 
     if (temp >numberofseats || temp <= 0) 
      {printf("Error: Seat nr should be between 1 and %d", numberofseats);} 
     else if (strcmp(passenger[temp-1].fullname,"\0")==0) 
      printf("Error: Seat is already free"); 

     else 
     cancelSeat(&passenger[temp-1]); 

     } 

    else if (selection=='5')               /*Menu 6 - Emfanisi listas kratimenon thesewn taksinomimenon kata ayksonta arithmo*/ 
     { 
     printf("The following seats are booked: \n Name, PhoneNr, SeatNr\n\n");         /*Emfanisi minimatos*/ 
     for (i=0; i<numberofseats; i++) 
      if (strcmp(passenger[i].fullname,"\0")!=0) 
      { 
       printf("%s, ",passenger[i].fullname); 
       for (j=0;j<10;j++) 
       {printf("%hu",passenger[i].phonenr[j]);} 

       printf(", %u\n",passenger[i].seatnr); 
      } 

     } 



    } while (selection!='0'); 









}