我正在开发阅读库存功能。我希望它读取我放在具有多个文件的项目中的inventory.txt文件中的内容。当我运行它时,我得到所有产品的产品编号的第一个积分值,但是在产品编号之后,我得到了与我的文本文件不匹配的损坏数据。看起来错误现在在我的switch语句中。有没有人看到我试图从我的swith语句中的文本文件中提取数据有什么不对?例如,我的控制台输出如下所示:
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;
}
答案 0 :(得分: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;
}