2016-08-07 3 views
0

Ich bin dabei, eine Lesebestandsfunktion zu entwickeln. Ich möchte, dass der Inhalt in einer inventory.txt-Datei gelesen wird, die ich in ein Projekt mit mehreren Dateien gestellt habe. Wenn ich es ausführe, bekomme ich den ersten Integralwert für die Produktnummer für alle Produkte, aber nach der Produktnummer bekomme ich beschädigte Daten, die nicht mit meiner Textdatei übereinstimmen. Sieht aus wie der Fehler jetzt in meinen switch-Anweisungen ist. Sieht irgendjemand etwas falsch, wie ich versuche, die Daten aus der Textdatei in meinen swith-Anweisungen zu ziehen? Zum Beispiel sieht meine Konsole Ausgabe wie folgt:Dateizeiger druckt falsche Daten aus, wenn ich das Programm C programmiere

1000 1.49 3.79 10 A Fish Food 


/* Here's my structure, I have this stored in a header file. */ 
struct inventory_s 
{ 
    int productNumber; 
    float mfrPrice; 
    float retailPrice; 
    int numInStock; 
    char liveInv; 
    char productName[PRODUCTNAME_SZ]; 
}; 

/* Here's the text I'm trying to insert from the inventory.txt file (this is my input file*/ 

1000, 1.49, 3.79, 10, 0, Fish Food 
2000, 0.29, 1.59, 100, 1, Angelfish 
2001, 0.09, 0.79, 200, 1, Guppy 
5000, 2.40, 5.95, 10, 0, Dog Collar Large 
6000, 49.99, 129.99, 3, 1, Dalmation Puppy 

/* Here's the function I've built so far */ 

int readInventory(void) 
{ 
    int count = 0; //counts record 
    int length = 0; //shows length of string after its read 
    int tokenNumber = 0; //shows which token its currently being worked on 
    char* token; //token returned by strtok function 
    struct inventory_s newInventory; //customer record 
    int sz = sizeof(struct inventory_s) * 2; //string size to read 
    char str[sz]; //where data is stored 

    FILE* inventoryFile = fopen("customer.txt", "r"); //opens and reads file 
    if (inventoryFile == NULL) //if file is empty 
     { 
      printf("Could not open data file\n"); 
      return -1; 
     } 
    while (fgets(str, sz, inventoryFile) != NULL) //if file is not empty 
    { 
     tokenNumber = INVENTORY_FIELD_PRODUCTNUMBER; 
     length = strlen(str); 
     str[length - 1] = '\0'; 
     token = strtok(str, ","); //adds space when there is a "," and breaks into individual words 
     while (token != NULL) 
     { 
      switch (tokenNumber) 
      { 
       case INVENTORY_FIELD_PRODUCTNUMBER: 
        newInventory.productNumber = atoi(token); 
        break; 
       case INVENTORY_FIELD_MFRPRICE: 
        newInventory.mfrPrice = atof(token); 
        break; 
       case INVENTORY_FIELD_RETAILPRICE: 
        newInventory.retailPrice = atof(token); 
        break; 
       case INVENTORY_FIELD_NUMINSTOCK: 
        newInventory.numInStock = atoi(token); 
        break; 
       case INVENTORY_FIELD_LIVEINV: 
        (newInventory.liveInv, token); 
        break; 
       case INVENTORY_FIELD_PRODUCTNAME: 
        strcpy(newInventory.productName, token); 
        break; 
      } 
      token = strtok(NULL, ","); 
      tokenNumber++; //starts the next inventory 

     } 
     count++; 
     printf("%i %.2f %.2f %i %c %s\n", newInventory.productNumber, newInventory.mfrPrice, newInventory.retailPrice, newInventory.numInStock, newInventory.liveInv, newInventory.productName); //prints out in console 


    } 
    fclose(inventoryFile); 
    return 0; 
} 
+2

'strcpy (newInventory.liveInv, Token)' - 'liveInv' ist ein einfaches' char', kein Array von 'char', so können Sie 't 'strcpy()' hinein. Sie versuchen auch, die gesamte Zeile nach dem Lesen jedes Tokens zu "printf"(), anstatt nach dem Lesen aller Token in dieser Zeile. Du verpasst irgendwo in deinem Code eine schließende Klammer. Sie zeigen uns Ihre Eingabedatei nicht an. –

+0

Ich arbeite daran. Danke, dass Sie mir geholfen haben. Ich komme jedes Mal weiter und weiter. Jetzt kann ich es ausdrucken, aber nur eine Zeile der Textdatei wird ausgedruckt. – RTriplett

Antwort

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

#define INVENTORY_FIELD_PRODUCTNUMBER 1 
#define INVENTORY_FIELD_MFRPRICE  2 
#define INVENTORY_FIELD_RETAILPRICE 3 
#define INVENTORY_FIELD_NUMINSTOCK  4 
#define INVENTORY_FIELD_LIVEINV  5 
#define INVENTORY_FIELD_PRODUCTNAME 6 

//defines the sizes of the contents in the structure 
#define PRODUCTNAME_SZ 20 

int main() 
{ 
    struct inventory_s 
    { 
     int productNumber; 
     float mfrPrice; 
     float retailPrice; 
     int numInStock; 
     char liveInv; 
     char productName[PRODUCTNAME_SZ]; 
    }; 

    int count = 0; //counts record 
    int length = 0; //shows length of string after its read 
    int tokenNumber = 0; //shows which token its currently being worked on 
    char* token; //token returned by strtok function 
    struct inventory_s newInventory; //customer record 
    int sz = sizeof(struct inventory_s) * 2; //string size to read 
    char str[sz]; //where data is stored 

    FILE* inventoryFile = fopen("inventory.txt", "r"); //opens and reads file 
    if (inventoryFile == NULL) //if file is empty 
     { 
      printf("Could not open data file\n"); 
      return -1; 
     } 
    while (fgets(str, sz, inventoryFile) != NULL) //if file is not empty 
    { 
     tokenNumber = INVENTORY_FIELD_PRODUCTNUMBER; 
     length = strlen(str); 
     str[length - 1] = '\0'; 
     token = strtok(str, ","); //adds space when there is a "," and breaks into individual words 

     while (token != NULL) 
     { 
      switch (tokenNumber) 
      { 
       case INVENTORY_FIELD_PRODUCTNUMBER: 
        newInventory.productNumber = atoi(token); 
        break; 
       case INVENTORY_FIELD_MFRPRICE: 
        newInventory.mfrPrice = atof(token); 
        break; 
       case INVENTORY_FIELD_RETAILPRICE: 
        newInventory.retailPrice = atof(token); 
        break; 
       case INVENTORY_FIELD_NUMINSTOCK: 
        newInventory.numInStock = atoi(token); 
        break; 
       case INVENTORY_FIELD_LIVEINV: 
        (newInventory.liveInv, token); 
        break; 
       case INVENTORY_FIELD_PRODUCTNAME: 
        strcpy(newInventory.productName, token); 
        break; 
      } 
      token = strtok(NULL, ","); 
      tokenNumber++; //starts the next inventory 

     } 

     printf("%i %.2f %.2f %i %c %s\n", newInventory.productNumber, newInventory.mfrPrice, newInventory.retailPrice, newInventory.numInStock, newInventory.liveInv, newInventory.productName); //prints out in console 
     count++; 

    } 
    fclose(inventoryFile); 
    return 0; 
} 
+0

Ich habe es herausgefunden! Ich hatte die fclose() schließen die Datei, bevor es die nächste Zeile der Eingabe lesen konnte. Danke für die Hilfe, die mir dabei geholfen hat, es herauszufinden. – RTriplett

Verwandte Themen